RegExp组参考上的特殊字符结果错误

时间:2012-10-21 02:13:45

标签: python regex reference regex-group

我的错误是什么?

>>> import re
>>> re.sub("(\[*?)","\1","x[[[y")
'\x01x\x01[\x01[\x01[\x01y\x01'

我该怎么办?

2 个答案:

答案 0 :(得分:2)

使用原始字符串表示正则表达式:

>>> import re
>>> re.sub(r'(\[*?)', r'\1', 'x[[[y')
'x[[[y'

当您编写'\1'时,\1被解释为转义序列。 '\\1'是使用普通字符串编写它的正确方法,相当于r'\1'

答案 1 :(得分:1)

\[*?不情愿地匹配零个或多个左方括号。换句话说,无论你在何处应用它,它都不会匹配任何东西。

量词通常是贪婪的,这意味着它们尽可能地匹配,同时仍然允许正则表达式作为一个整体来匹配。这就是大多数时候“回溯”意味着什么:贪婪的量词回馈他们吞噬的角色,以便正则表达式的其余部分可以匹配它所需要的。

不情愿的量词恰恰相反:它们首先消耗最少的字符数,然后只有在达到整体匹配所需的时候才会占用更多。但在你的情况下,它永远不必要; \[*?是整个正则表达式,因此匹配空字符串的内容。 永远不会将一个不情愿的量词作为正则表达式中的最后一件事。

为了清除任何可能的混淆,原始字符串中的括号未被捕获并重新插入,它们,就像x和{{1 }} 是。如果您使用了@Blender建议的原始字符串(正确 - 这是另一个错误),您的输出将是原始字符串:

y

它匹配每个字符边界处的空字符串(即,开头和结尾,以及每对字符之间),并重新插入它们 - 总效果,无。我不知道你想要完成什么,但如果你想用一个替换三个括号,你应该使用>>> re.sub(r"(\[*?)",r"\1","x[[[y") 'x[[[y' 代替+,你应该把它放在捕获之外组:

*?