Python:\ re.sub中的数字反向引用

2024-05-12 22:23:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用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>"

Tags: the函数text文本importresearchtype
2条回答
>>> text.replace("><", "<")
'<hi type="italic"> the</hi>'

你的代码中有两个错误。首先,您没有匹配(特别是捕获)您认为匹配和捕获的内容——在调用.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>'

或者,可以将所有反斜杠加倍,以避免它们被当作转义序列的开始,但是,原始字符串文字语法可读性要高得多。

相关问题 更多 >