0

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

之后 text 的值应该是

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

2 回答 2

10

您的代码中有两个错误。首先,你没有匹配(特别是捕捉)你认为你匹配和捕捉的东西——在你调用之后插入.search

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

重复的无限制重复(在捕获组之后只有星号)匹配一次太多 - 在你认为你正在匹配的结尾处有空字符串 - 这就是被捕获的内容。通过将至少一颗星更改为加号来修复,例如,通过:

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

现在 THIS 可以合理地匹配和捕捉。其次,您没有在应该使用原始字符串文字语法的地方使用反斜杠,因此您没有反斜杠 - 您有一个\1与 chr(1) 相同的转义序列。通过使用原始字符串文字语法修复,即在上面的代码片段之后

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

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

于 2009-07-30T03:13:55.023 回答
0
>>> text.replace("><", "<")
'<hi type="italic"> the</hi>'
于 2009-07-30T03:05:21.693 回答