我的错误是什么?
>>> import re
>>> re.sub("(\[*?)","\1","x[[[y")
'\x01x\x01[\x01[\x01[\x01y\x01'
我该怎么办?
答案 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'
代替+
,你应该把它放在捕获之外组:
*?