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

时间:2016-01-18 17:33:00

标签: python regex

''执行['h', 'e', 'l', 'l', 'o', '']re.findall('[\w]?', 'hello')的原因是什么?我认为结果是['h', 'e', 'l', 'l', 'o'],没有最后一个空字符串。

2 个答案:

答案 0 :(得分:40)

正则表达式中的问号(if [ ! awk -v x=y '1' /dev/null >/dev/null 2>&1 ] then AWK=$(which awk | tail -1) else AWK=$(which awk) fi $AWK -v x=y 'script' file )负责将空字符串作为返回结果之一。

问号是量词意义"零或一匹配。"您要求出现所有出现的零或一个"单词字符"。这些字母满足" - 或 - 一个单词字符"比赛。空字符串满足“零字符”匹配条件。

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

答案 1 :(得分:5)

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

您正在搜索[\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'& ''。这是因为它现在更喜欢找零,但它不会在没有前进的情况下连续找到两个零长度匹配。