re.findall()返回的元组中的第一个字符串是否总是最长的匹配字符串?

问题描述:

re.findall(r'((([0-9]|[a-z]|[A-Z]){5,8},)*([0-9]|[a-z]|[A-Z]){5,8} reporting and syncing)', 'johnny, joda89 reporting and syncing heyff, jkojo, jkjkjdf, 2378a reporting and syncing and a lot of other jazz. I looked into whether 34987, 22187, and 36547 will report, but no one has gotten back with me about that. Also 34298 reporting and syncing.') 

给我re.findall()返回的元组中的第一个字符串是否总是最长的匹配字符串?

[('johnny, joda89 reporting and syncing', 'johnny, ', 'y', '9'), ('heyff, jkojo, jkjkjdf, 2378a reporting and syncing', 'jkjkjdf, ', 'f', 'a'), ('34298 reporting and syncing', '', '', '8')] 

在这个例子中,每个元组的第一个字符串是最长的。情况总是如此吗?如果有人知道每个元组中的其他字符串来自哪里,我也很想知道!谢谢!

情况总是如此吗?

不,那永远不是这样。匹配从返回从左到右

re.findall

该字符串被扫描的左到右,和火柴都在 顺序返回找到

+0

我看到每个元组匹配那些元组的顺序该列表随同从左到右匹配的顺序在字符串中进行。我不明白为什么每个元组中的第二,第三和第四个字符串都在那里,并且试图弄清楚最长匹配是否将始终是每个元组中的第一个字符串,如上例所示。 – clearcom0

+0

有没有人知道为什么在上面的例子中返回每个元组的第二,第三和第四个字符串,或者我如何修改正则表达式以便它们不被返回? – clearcom0

+1

如果没有捕获或捕获组的元组,则findall返回完全匹配。捕获是任何一对简单的圆括号'(...)',并且它们按顺序遇到。例如,上次捕获是'([0-9] | [a-z] | [A-Z])',它只匹配一个字符;所以每个最后的元组成员都是单个匹配的字符。为了避免这种情况,可以将它们转换为非捕获组:'(?:...)'(只需在括号内插入“?:'”)。 – Amadan