Python正则表达式教程之三:贪婪/非贪婪特性
之前已经简单介绍了Python正则表达式的基础与捕获,那么在这一篇文章里,我将总结一下正则表达式的贪婪/非贪婪特性。
贪婪
默认情况下,正则表达式将进行贪婪匹配。所谓“贪婪”,其实就是在多种长度的匹配字符串中,选择较长的那一个。例如,如下正则表达式本意是选出人物所说的话,但是却由于“贪婪”特性,出现了匹配不当:
> sentence = """You said "why" and I say "I don't know".""" > re.findall(r'"(.*)"', sentence) ['why" and I say "I don\'t know']
再比如,如下的几个例子都说明了正则表达式“贪婪”的特性:
> re.findall('hi*', 'hiiiii') ['hiiiii'] > re.findall('hi{2,}', 'hiiiii') ['hiiiii'] > re.findall('hi{1,3}', 'hiiiii') ['hiii']
非贪婪
当我们期望正则表达式“非贪婪”地进行匹配时,需要通过语法明确说明:
捕获与非贪婪 严格来说,这一部分并不是非贪婪特性。但是由于其行为与非贪婪类似,所以为了方便记忆,就将其放在一起了。 这样的正则表达式显然无法完成任务。为什么呢?原因就是,在第一个(\w+)匹配到what,并且其后的\1也匹配到第二个what的时候,“Oh what a day, what”这一段子串都已经被正则表达式消耗了,所以之后的匹配,将直接从第二个what之后开始。自然地,这里只能找出一个出现了两次的单词。 那么解决方案,就和上面提到的("htmlcode">
以上就是Python正则表达式中关于贪婪的全部内容了,希望本文的内容对大家的学习或者使用python能能带来一定的帮助,如果有疑问大家可以留言交流,如果有疑问大家可以留言交流。下一篇文章,我会继续总结一下Python正则表达式re模块的一些API的用法,请继续关注。{2,5}"htmlcode">
> re.findall('hi*"htmlcode">
> sentence = """You said "why" and I say "I don't know"."""
> re.findall(r'"(.*"', sentence)
['why"I don't know"]
("htmlcode">
> sentence = "Oh what a day, what a lovely day!"
> re.findall(r'\b(\w+)\b.*\b\1\b', sentence)
['what']
> re.findall(r'\b(\w+)\b("htmlcode">
> re.search(r'([a-z]).*("color: #ff0000">总结
下一篇:Python实现 多进程导入CSV数据到 MySQL