Как предложил Игнасио Васкес-Абрамс, вы можете решить свои проблемы, передав функцию, вызываемую в re.sub()
. Я подумал, что пример кода объяснит это лучше всего, так что здесь вы идете:
import re
s = "fsa fad fdsa dsafasdf u.s.a. U.S.A. u.s.a fdas adfs.f fdsa f.afda"
s_pat = r'(?<=\s)(([a-zA-Z]\.)+[a-zA-Z]\.{0,1})(?=\s)'
pat = re.compile(s_pat)
def add_acronym_tag(match_object):
s = match_object.group(0)
s = s.replace('.', '').upper()
return "<acronym>%s</acronym>" % s
s = re.sub(pat, add_acronym_tag, s)
print s
Вышеуказанные отпечатки:
fsa fad fdsa dsafasdf <acronym>USA</acronym> <acronym>USA</acronym> <acronym>USA</acronym> fdas adfs.f fdsa f.afda
То есть вы фактически не изменяете обратную ссылку, потому что строки неизменяемы. Но это так же хорошо: вы можете написать функцию для любой обработки, которую хотите, а затем вернуть все, что хотите, и это то, что re.sub()
вставит в конечный результат.
Обратите внимание, что вы можете использовать регулярные выражения внутри своей функции; Я просто использовал строковый метод .replace()
, потому что вы просто хотите избавиться от одного символа, и для этого вам не нужны все возможности регулярных выражений.