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