Python regexp替换标签内的文本

时间:2018-03-27 20:56:49

标签: python regex

我正在尝试用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##

有人知道如何替换标签内的整个内容吗?

谢谢!

1 个答案:

答案 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##'