我正在尝试用python sub替换标签内的文本块。
文本块:
text = """##startBlablaTag##
blablabla
blebleble
bliblibli
##endtBlablaTag##
使用以下正则表达式和“搜索”我可以捕捉标签内部的内容
>>> re.search(r'^##\w+Blabla\w+##\n(.*)##\w+Blabla\w+##', text, re.MULTILINE | re.DOTALL).group(1)
'blablabla\blebleble\bliblibli\n'
>>>
但是当我尝试用“sub”替换时,我无法替换整个内容,只是结束......
>>> re.sub(r'^##\w+Blabla\w+##\n(.*)##\w+Blabla\w+##', r'\g<1>test!', text, flags=re.MULTILINE | re.DOTALL)
'blablabla\nblebleble\nbliblibli\ntest!'
Expected:
##startBlablaTag##
test!
##endtBlablaTag##
有人知道如何替换标签内的整个内容吗?
谢谢!
答案 0 :(得分:1)
你正在倒退。
你使用的正则表达式是:
^##\w+Blabla\w+##\n(.*)##\w+Blabla\w+##
如您所见,您已使用捕获组捕获标记内的文本。换句话说,您已捕获了要删除的文本。这没有任何意义 - 您应该在要保留的文本周围使用捕获组。换句话说,正则表达式应如下所示:
^(##\w+Blabla\w+##\n).*(##\w+Blabla\w+##)
现在,您可以使用反向引用在替换期间引用捕获的文本,并在标记内插入新文本:
>>> re.sub(r'^(##\w+Blabla\w+##\n).*(##\w+Blabla\w+##)', r'\1test!\2', text, flags=re.S)
'##startBlablaTag##\ntest!##endtBlablaTag##'