Dan*_*iel 0 python regex backreference
我正在尝试使用python的re.sub函数来替换一些文本.
>>> import re
>>> text = "<hi type=\"italic\"> the></hi>"
>>> pat_error = re.compile(">(\s*\w*)*>")
>>> pat_error.search(text)
<_sre.SRE_Match object at 0xb7a3fea0>
>>> re.sub(pat_error, ">\1", text)
'<hi type="italic">\x01</hi>'
Run Code Online (Sandbox Code Playgroud)
之后文本的值应该是
"<hi type="italic"> the</hi>"
Run Code Online (Sandbox Code Playgroud)
Ale*_*lli 10
代码中有两个错误.首先,你没有匹配(特别是捕捉)你认为你匹配和捕捉的东西 - 在你打电话之后插入.search:
>>> _.groups()
('',)
Run Code Online (Sandbox Code Playgroud)
不受限制的重复重复(在捕获组之后只有星星之后的星形)匹配一次太多 - 在你认为你匹配的结尾处有空字符串 - 这就是被捕获的东西.通过将至少一个星星改为加号来修复,例如:
>>> pat_error = re.compile(r">(\s*\w+)*>")
>>> pat_error.search(text)
<_sre.SRE_Match object at 0x83ba0>
>>> _.groups()
(' the',)
Run Code Online (Sandbox Code Playgroud)
现在,这个匹配和捕获明智.其次,你没有使用原始字符串文字语法,所以你没有反斜杠,你认为你有一个反斜杠 - 你有一个\1与chr(1)相同的转义序列.使用原始字符串文字语法修复,即在上面的代码段之后
>>> pat_error.sub(r">\1", text)
'<hi type="italic"> the</hi>'
Run Code Online (Sandbox Code Playgroud)
或者,您可以将所有反斜杠加倍,以避免它们被视为转义序列的开始 - 但是,原始字符串文字语法更具可读性.