我的错误是什么?
>>> import re
>>> re.sub("(\[*?)","\1","x[[[y")
'\x01x\x01[\x01[\x01[\x01y\x01'
我能怎么做 ?
我的错误是什么?
>>> import re
>>> re.sub("(\[*?)","\1","x[[[y")
'\x01x\x01[\x01[\x01[\x01y\x01'
我能怎么做 ?
对正则表达式使用原始字符串:
>>> import re
>>> re.sub(r'(\[*?)', r'\1', 'x[[[y')
'x[[[y'
当你写'\1'
,\1
被解释为一个转义序列。'\\1'
是用普通字符串编写它的正确方法,相当于r'\1'
.
\[*?
不情愿地匹配零个或多个左方括号。换句话说,它每次都不匹配,无论你在哪里应用它。
量词通常是贪婪的,这意味着它们尽可能匹配,同时仍然允许整个正则表达式匹配。这就是“回溯”在大多数情况下的含义:贪婪的量词返回他们吞噬的字符,以便正则表达式的其余部分可以匹配它需要的内容。
不情愿的量词正好相反:它们首先消耗最少数量的字符,然后只有在达到整体匹配所必需的情况下才会消耗更多。但在你的情况下,它从来没有必要;\[*?
是整个正则表达式,所以它的内容是匹配一个空字符串。 将不情愿的量词作为正则表达式中的最后一件事是没有意义的。
只是为了消除任何可能的混淆,原始字符串中的括号并没有被捕获和重新插入,它们被留在那里,就像x
andy
一样。如果您按照@Blender 的建议使用了原始字符串(正确——这是另一个错误),您的输出将是原始字符串:
>>> re.sub(r"(\[*?)",r"\1","x[[[y")
'x[[[y'
它在每个字符边界(即开头和结尾,以及每对字符之间)匹配一个空字符串,然后重新插入它们——总效果,没有。我不知道你想要完成什么,但如果你想用一个替换三个括号,你应该使用+
而不是*?
,你应该把它放在捕获组之外:
>>> re.sub(r"(\[)+",r"\1","x[[[y")
'x[y'