是什么原因导致''的['h', 'e', 'l', 'l', 'o', ''],当你做re.findall('[\w]?', 'hello').我以为结果会是['h', 'e', 'l', 'l', 'o'],没有最后一个空字符串.
小智 40
regex('[\w]?')中的问号负责将空字符串作为返回结果之一.
问号是量词,意思是"零或一匹配".您要求所有出现的零或一个"单词字符".这些字母满足" - 或 - 一个字符"的匹配.空字符串满足"零字符"匹配条件.
将正则表达式更改为'\w'(删除问号和多余的字符类括号),输出将如您所愿.
正则表达式一次搜索一个字符的字符串.如果在字符位置找到匹配,则正则表达式前进到模式的下一部分.如果未找到匹配项,则正则表达式会尝试交替(不同的变体)(如果可用).如果所有备选方案都失败,它会回溯并尝试交替使用前一部分,依此类推,直到找到整个匹配或所有备选方案都失败.这就是为什么一些看似简单的正则表达式会快速匹配字符串,但在指数时间内无法匹配的原因.在您的示例中,您只有一个部分符合您的模式.
你在寻找[\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'和''.这是因为它现在更喜欢找零,但它不能在没有前进的情况下连续找到两个零长度匹配.
| 归档时间: |
|
| 查看次数: |
1417 次 |
| 最近记录: |