Python 是什么导致'';在[';h';、';e';';l';l';';o';';&';&&#当您在findall('&#w;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

Python 是什么导致'';在[';h';、';e';';l';l';';o';';&';&&#当您在findall('&#w;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&,python,regex,Python,Regex,当您执行re.findall(“[\w]?”,“hello”)时,是什么原因导致['h','e','l','l','o','中的'。我以为结果将是['h','e','l','l','o'],没有最后一个空字符串。正则表达式中的问号('[\w]?'))负责将空字符串作为返回结果之一 问号是一个量词,意思是“零或一个匹配项”。您要求所有出现的零或一个“单词字符”。字母满足“-或一个单词字符”匹配。空字符串满足“零字字符”匹配条件 将正则表达式更改为'\w'(删除问号和多余的字符类括号),输出结果将与

当您执行
re.findall(“[\w]?”,“hello”)时,是什么原因导致
['h','e','l','l','o','
中的
'
。我以为结果将是
['h','e','l','l','o']
,没有最后一个空字符串。

正则表达式中的问号(
'[\w]?')
)负责将空字符串作为返回结果之一

问号是一个量词,意思是“零或一个匹配项”。您要求所有出现的零或一个“单词字符”。字母满足“-或一个单词字符”匹配。空字符串满足“零字字符”匹配条件


将正则表达式更改为
'\w'
(删除问号和多余的字符类括号),输出结果将与预期一致。

正则表达式一次搜索字符串一个字符。如果在字符位置找到匹配项,正则表达式将前进到模式的下一部分。如果没有找到匹配项,正则表达式将尝试替换(不同的变体)(如果可用)。如果所有备选方案都失败,它将回溯并尝试交替使用前一部分,依此类推,直到找到整个匹配项或所有备选方案都失败。这就是为什么一些看似简单的正则表达式会很快匹配字符串,但无法在指数时间内匹配。在您的示例中,您的模式只有一个部分

您正在搜索
[\w]?
表示“前一部分的10”,相当于
{0,1}
。每个
'h'
'e'
'l'
'l'
'o'
匹配
[\w]{1}
,因此每个字母的模式前进并完成,在开始时重新启动正则表达式,因为您要求所有匹配项,而不仅仅是第一个。在字符串的末尾,正则表达式仍在尝试查找匹配项<代码>[\w]{1}
不再匹配,但是替代的
[\w]{0}
匹配,因此它匹配
'
。现代正则表达式引擎有一条规则,可以阻止零长度匹配在同一位置重复。正则表达式再次尝试,但这次失败,因为它找不到
[\w]{1}
的匹配项,并且已经找到了
[\w]{0}
的匹配项。它不能在字符串中前进,因为它位于末尾,所以退出。它已运行该模式7次,并找到6个匹配项,最后一个匹配项为空


正如在评论中指出的,如果您的正则表达式是
\w???
(我已经删除了
[
]
,因为它们在原始正则表达式中不是必需的),这意味着查找零或一(注意顺序已从以前更改)。它将返回
'
'h'
'
'e'
'
'l'
'l'
'
'o'
'o'
。这是因为它现在更喜欢查找零,但如果不前进,它无法在一行中查找两个零长度匹配。

请注意,在这种情况下,字符类是多余的,因为您只包含一个(元)字符<代码>“\w”是相同的。还要注意,如果丢失了
,您将获得预期的结果。解释在下面的答案中。只是为了好玩,
re.findall(r'[\w]?','')
也找到了一个
['']
。我也可以加入投票党吗?我在哪里投票?同样值得一提的是(也许是说明性的!)
“\w???”
匹配一个或零个单词字符,但更喜欢匹配零。那里的输出都是空字符串!如果按照您的解释,正则表达式是无限的,因为在字符串的末尾有无限数量的“空字符串”。为什么只捕获一个“空字符串”?正是为了防止您想象的无限结果,regexp引擎的行为就像每对字符之间以及第一个/最后一个字符之前/之后只有一个空字符串一样。(当与
findall
一起使用时,您的regexp只匹配输入端的空字符串,因为在所有其他位置,它可以选择匹配空字符串和匹配较长(非空)字符串,并且更喜欢匹配较长的字符串。)@nicael:因为regex量词是贪婪的,因此,它只匹配输入字符串末尾的空字符串。