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