当你做re.findall('[\ w]?','hello')时,导致''h','e','l','l','o','']的原因是什么?

Wag*_*det 25 python regex

是什么原因导致''['h', 'e', 'l', 'l', 'o', ''],当你做re.findall('[\w]?', 'hello').我以为结果会是['h', 'e', 'l', 'l', 'o'],没有最后一个空字符串.

小智 40

regex('[\w]?')中的问号负责将空字符串作为返回结果之一.

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

将正则表达式更改为'\w'(删除问号和多余的字符类括号),输出将如您所愿.

  • 也值得注意(也许是说明性的!)`'\ w ??'匹配一个或零个字符但*更喜欢匹配零*.那里的输出都是空字符串! (7认同)
  • 如果按照你的解释,正则表达式只是无限的,因为在字符串的末尾有无限数量的"空字符串".为什么只捕获一个"空字符串"? (7认同)
  • 准确地说,为了防止你想象的无限结果,正则表达式引擎表现得好像每对字符之间只有一个*空字符串,并且在第一个/最后一个字符之前/之后.(当与`findall`一起使用时,你的regexp只匹配输入末尾的空字符串,因为在所有其他位置它可以在匹配空字符串和匹配更长(非空)字符串之间进行选择,并且它更喜欢匹配一个更长的字符串.) (7认同)

CJ *_*nis 5

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

你在寻找[\w]?.的?意思是" 一个之前部分的",相当于{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'''.这是因为它现在更喜欢找零,但它不能在没有前进的情况下连续找到两个零长度匹配.