Я хочу заменить текст совпадающих шаблонов re в строке и сделать это с помощью re.sub()
, если передать его в качестве аргумента repl
в вызове, он работает по желанию, как показано ниже :Замена названных групп захвата на re.sub
from __future__ import print_function
import re
pattern = r'(?P<text>.*?)(?:<(?P<tag>\w+)>(?P<content>.*)</(?P=tag)>|$)'
my_str = "Here's some <first>sample stuff</first> in the " \
"<second>middle</second> of some other text."
def replace(m):
return ''.join(map(lambda v: v if v else '',
map(m.group, ('text', 'content'))))
cleaned = re.sub(pattern, replace, my_str)
print('cleaned: {!r}'.format(cleaned))
Выход:
cleaned: "Here's some sample stuff in the middle of some other text."
Однако из документации это звучит, как я должен быть в состоянии получить те же результаты, просто передавая ему строку замены со ссылками на названных групп в нем. Однако моя попытка сделать это не сработала, потому что иногда группа не имеет себе равных, а возвращаемое значение равно None
(а не пустая строка ''
).
cleaned = re.sub(pattern, r'\g<text>\g<content>', my_str)
print('cleaned: {!r}'.format(cleaned))
Выход:
Traceback (most recent call last):
File "test_resub.py", line 21, in <module>
cleaned = re.sub(pattern, r'\g<text>\g<content>', my_str)
File "C:\Python\lib\re.py", line 151, in sub
return _compile(pattern, flags).sub(repl, string, count)
File "C:\Python\lib\re.py", line 278, in filter
return sre_parse.expand_template(template, match)
File "C:\Python\lib\sre_parse.py", line 802, in expand_template
raise error, "unmatched group"
sre_constants.error: unmatched group
Что я делаю неправильно или не понимая?
«Содержание» последнего совпадения - None ... – kennytm
@KennyTM: Я знаю, что некоторые из групп соответствия будут 'None', поэтому я использую' lambda v: v if v else '' ' в функции 'replace()'. Что-то в этом нуждается в заменяющей строке, и если да, то как это делается? – martineau