0

我的错误是什么?

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

我能怎么做 ?

4

2 回答 2

2

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

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

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

于 2012-10-21T02:16:47.013 回答
1

\[*?不情愿地匹配零个或多个左方括号。换句话说,它每次都不匹配,无论你在哪里应用它。

量词通常是贪婪的,这意味着它们尽可能匹配,同时仍然允许整个正则表达式匹配。这就是“回溯”在大多数情况下的含义:贪婪的量词返回他们吞噬的字符,以便正则表达式的其余部分可以匹配它需要的内容。

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

只是为了消除任何可能的混淆,原始字符串中的括号并没有被捕获和重新插入,它们被留在那里,就像xandy一样。如果您按照@Blender 的建议使用了原始字符串(正确——这是另一个错误),您的输出将是原始字符串:

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

它在每个字符边界(即开头和结尾,以及每对字符之间)匹配一个空字符串,然后重新插入它们——总效果,没有。我不知道你想要完成什么,但如果你想用一个替换三个括号,你应该使用+而不是*?,你应该把它放在捕获组之外:

>>> re.sub(r"(\[)+",r"\1","x[[[y")
'x[y'
于 2012-10-21T02:53:36.333 回答