Python:\ number在re.sub中的反向引用

时间:2009-07-30 03:01:35

标签: 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>'

之后文本的值应为

"<hi type="italic"> the</hi>"

2 个答案:

答案 0 :(得分:9)

代码中有两个错误。首先,您没有匹配(并且具体地,捕获)您认为匹配和捕获的内容 - 在致电.search后插入:

>>> _.groups()
('',)

无拘无束的重复重复(在捕捉组之后只有星星之后的星星)匹配一次太多 - 在你认为你匹配的结尾处有一个空字符串 - 这就是被捕获的东西。通过将至少一个星星改为加号来修复,例如:

>>> pat_error = re.compile(r">(\s*\w+)*>")
>>> pat_error.search(text)
<_sre.SRE_Match object at 0x83ba0>
>>> _.groups()
(' the',)

现在这个匹配和捕获明智。其次,你没有使用原始字符串文字语法,所以你没有反斜杠,你认为你有一个反斜杠 - 你有一个与chr(1)相同的转义序列\1。使用原始字符串文字语法修复,即在上面的代码段

之后
>>> pat_error.sub(r">\1", text)
'<hi type="italic"> the</hi>'

或者你可以将所有反斜杠加倍,以避免它们被视为转义序列的开始 - 但是,原始字符串文字语法更具可读性。

答案 1 :(得分:0)

>>> text.replace("><", "<")
'<hi type="italic"> the</hi>'