Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 组引用上的RegExp特殊字符结果错误_Python_Regex_Reference_Regex Group - Fatal编程技术网

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'