У меня есть похожая функция, которую я написал для этого. Я пытался повторить функциональность SQL REGEXP_REPLACE()
. Я закончил с:
def sql_regexp_replace( txt, pattern, replacement='', position=1, occurrence=0, regexp_modifier='c'):
class ReplWrapper(object):
def __init__(self, replacement, occurrence):
self.count = 0
self.replacement = replacement
self.occurrence = occurrence
def repl(self, match):
self.count += 1
if self.occurrence == 0 or self.occurrence == self.count:
return match.expand(self.replacement)
else:
try:
return match.group(0)
except IndexError:
return match.group(0)
occurrence = 0 if occurrence < 0 else occurrence
flags = regexp_flags(regexp_modifier)
rx = re.compile(pattern, flags)
replw = ReplWrapper(replacement, occurrence)
return txt[0:position-1] + rx.sub(replw.repl, txt[position-1:])
Одно важное замечание, которое я не упомянул, это то, что вам нужно вернуть match.expand()
, иначе он не развернет шаблоны \1
должным образом и будет рассматривать их как литералы.
Если вы хотите, чтобы это работало, вам нужно будет по-разному обрабатывать флаги (или взять его из my github , его легко реализовать, и вы можете заглушить его для теста, установив для него 0
и игнорируя мой звонок regexp_flags()
).