Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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 为什么这个正则表达式匹配最后一个组而不是整个字符串?_Python_Regex - Fatal编程技术网

Python 为什么这个正则表达式匹配最后一个组而不是整个字符串?

Python 为什么这个正则表达式匹配最后一个组而不是整个字符串?,python,regex,Python,Regex,这是一个更大的正则表达式的一部分,其目的是使标记为test的整个字符串匹配并归入捕获组,但第一个和最后三个括号除外 如前所述,我的理解是正则表达式应该捕获一个左括号和三个右括号之间的字符串 正则表达式:\[^\\]*\\[\s]* 测试:测试1,3.7,88,测试,str,测试2,1.9,33,测试,str 当与Python的标准正则表达式库一起使用时,实际上只有Test_2、1.9、33、Test、str与正则表达式匹配,而不是与整个字符串匹配。我一定是错过了什么,但我很难弄清楚这是什么,以及

这是一个更大的正则表达式的一部分,其目的是使标记为test的整个字符串匹配并归入捕获组,但第一个和最后三个括号除外

如前所述,我的理解是正则表达式应该捕获一个左括号和三个右括号之间的字符串

正则表达式:\[^\\]*\\[\s]*

测试:测试1,3.7,88,测试,str,测试2,1.9,33,测试,str

当与Python的标准正则表达式库一起使用时,实际上只有Test_2、1.9、33、Test、str与正则表达式匹配,而不是与整个字符串匹配。我一定是错过了什么,但我很难弄清楚这是什么,以及如何解决它

test=r"((Test_1, (3.7, 88, test,, str)), (Test_2, (1.9, 33, test,, str))) ,"
re.compile(r"\(([^\)\)\)]*)\)\)\)[\s]*,?").search(test).group(0)
>>> '(Test_2, (1.9, 33, test,, str))) ,'

您的正则表达式需要3个右括号。您的示例在第一部分中只有2个,因此只遇到第二个

UPD:

如果要捕获整个字符串,应使用以下模式:

\[\s\s]*?\{3}[\s]*

[\s\s]表示将捕获任何符号。也有效

*??使它不贪婪,防止捕获整个文本直到最后一个。它将捕获尽可能小的块

请参见

Regex:\+\\\

输出:测试1,3.7,88,测试,str,测试2,1.9,33,测试,str

它将删除第一个和最后3个括号,如您所指定的。但我相信你也会发现这一点很有用:

正则表达式:\+\\\

输出:测试1,3.7,88,测试,str,测试2,1.9,33,测试,str

它删除最后三个括号中的第一个括号和最后一个括号。正则表达式将始终查找最大的匹配项,因此如果括号不是最后一个,则无需指定not括号。

[^\\\]相当于[^],因此匹配项不能包含右括号。只需将其替换为。*

您还可以将\\\简化为\{3},将[\s]简化为\s

输出:

符合事实的 测试1,3.7,88,测试,str,测试2,1.9,33,测试,str, 测试1,3.7,88,测试,str,测试2,1.9,33,测试,str
现在,.*是贪婪的,所以它可以包含一个匹配\{3}\s*,?如果测试中有第二次出现。您可以通过使其非贪婪来避免这种情况:.*?

\\\需要匹配3秒。[^\\]*匹配任何0个或更多字符,而不是。这就是为什么。您的正则表达式等于\[^]*\{3}\s*,?在点旁边,但组0是整个匹配项。我想您想要第1组。@wjandrea,谢谢-您是对的,但对于我显示的示例,我在代码的其他地方使用了捕获,而不是捕获,但认为匹配本身与问题更相关。regex标记的标记信息有一个常见的gotcha列表,包括这里的一个,即[aaa]相当于[a],不是aaa;这本书值得一读,有助于揭开一些正在发生的事情的神秘面纱。为什么第一部分不能和第二部分一起被捕捉?正则表达式指定一个以一个括号开始,以三个括号结束的组。因为第一部分不是以三结尾,而是以一开头,是什么阻止它被包含在匹配中?@alomeli我告诉过你,[^]等于[^]OP希望匹配整个字符串,包括两个部分,因为[^\\\]阻止右括号在匹配中。此外,这也没有意义,因为它可以被替换为[^\]。现在还不清楚你想在这里实现什么,恰恰相反,这是很清楚的。OP想要\?:\{3} .*{3}\s*。但是[\s\s]*?,或。*?,就足够了。
import re

test = r"((Test_1, (3.7, 88, test,, str)), (Test_2, (1.9, 33, test,, str))) ,"
pattern = r"\((.*)\){3}\s*,?"
regex = re.compile(pattern)
m = regex.match(test)

print(m.group(0) == test)
print(m.group(0))
print(m.group(1))