Хороший первый дубль :) Я думаю, что эта версия немного более читабельна (и, вероятно, немного быстрее). Ключевым моментом, на который следует обратить внимание, является использование re.sub . Держит нас подальше от неприятных индексов матчей ...
import re
PHONE_RE = re.compile('([(]{0,1}[2-9]\d{2}[)]{0,1}[-_. ]{0,1}[2-9]\d{2}[-_. ]{0,1}\d{4})')
NON_NUMERIC = re.compile('\D')
def numbers2links(s):
def makelink(mo):
raw_number = mo.group()
number = NON_NUMERIC.sub("", raw_number)
return '<a href="tel:%s">%s</a>' % (number, raw_number)
return PHONE_RE.sub(makelink, s)
print numbers2links("Ghost Busters at (555) 423-2368! How about this one: 555 456 7890! 555-456-7893 is where its at.")
Примечание. В своей практике я не заметил большого ускорения предварительной компиляции простых регулярных выражений, таких как два, которые я использую, даже если вы используете их тысячи раз. Модуль re может иметь какое-то внутреннее кэширование - не удосужился прочитать исходный код и проверить.
Кроме того, я заменил ваш метод проверки каждого символа, чтобы увидеть, находится ли он в string.digits
, на другой re.sub()
, потому что я думаю, что моя версия более читабельна, а не потому, что я уверен, что она работает лучше (хотя это могло бы быть).