我对以下三种模式感到困惑,有人会更详细地说明吗?
## IPython with Python 2.7.3
In [62]: re.findall(r'[a-z]*',"f233op")
Out[62]: ['f', '', '', '', 'op', ''] ## why does the last '' come out?
In [63]: re.findall(r'([a-z])*',"f233op")
Out[63]: ['f', '', '', '', 'p', ''] ## why does the character 'o' get lost?
In [64]: re.findall(r'([a-z]*)',"f233op")
Out[64]: ['f', '', '', '', 'op', ''] ## what's the different than line 63 above?
re.findall(r'[a-z]*',"f233op")
此模式匹配零个或多个小写字母字符的实例。零或更多部分在这里是关键,因为从字符串中每个索引位置开始的空匹配都与f
或匹配一样有效op
。返回的最后一个空字符串匹配从字符串(之间的位置的端部开始p
与$
串的(结束)。
re.findall(r'([a-z])*',"f233op")
现在,您正在匹配由单个小写字母字符组成的字符组。将o
不再返回,因为这是一个贪婪的搜索,最后有效的匹配组将被退回。因此,如果将字符串更改为f233op12fre
,e
则将返回最终值,但不会返回前一个f
或r
。同样,如果您p
在字符串中取出,您仍然会看到该字符串o
作为有效匹配项返回。
相反,如果您尝试通过添加?
(例如([a-z])*?
)来使此正则表达式变得非贪婪,则返回的匹配集将全部为空字符串,因为有效的无匹配项优先于某些有效匹配项。
re.findall(r'([a-z]*)',"f233op")
匹配的字符没有什么不同,但是现在您将返回字符组,而不是原始匹配。此正则表达式查询的输出与第一个示例相同,但是您会注意到,如果添加其他匹配组,则会突然看到将每个匹配尝试的结果分组为元组的结果:
IN : re.findall(r'([a-z]*)([0-9]*)',"f233op")
OUT: [('f', '233'), ('op', ''), ('', '')]
将其与相同的模式(减去括号(组))进行对比,您将看到它们为何如此重要的原因:
IN : re.findall(r'[a-z]*[0-9]*',"f233op")
OUT: ['f233', 'op', '']
将这样的正则表达式模式插入到Regexplained之类的正则表达式图生成器中以查看模式匹配逻辑如何工作可能会很有用。例如,作为正则表达式为什么总是返回空字符串匹配的解释,请看一下模式[a-z]*
和之间的区别[a-z]+
。
如果您遇到困难,请不要忘记检查Python文档中的re
库,它们实际上为标准regex语法提供了非常出色的解释。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句