相关文章推荐
热心的西装  ·  如何使用React ...·  1 年前    · 
飞翔的橡皮擦  ·  python ...·  1 年前    · 
首发于 Python笔记

python正则贪婪与非贪婪

字符串:

Thu Feb 15 17:46:04 2007::uzifzf@dpyivihw.gov::1171590364-6-8

我们将匹配到包含三个整数的数据集:1171590364-6-8

贪婪模式

代码

import re
data = 'Thu Feb 15 17:46:04 2007::uzifzf@dpyivihw.gov::1171590364-6-8'
patt = '.+(\d+-\d+-\d+)'
m = re.match(patt, data)
m.group(1)

效果

我们将提取 1171590364-6-8,而不仅仅是 4-6-8。第一个整数的其余部分在哪 儿?

问题在于正则表达式本质上实现贪婪匹配。这就意味着对于该通配符模式,将对正则表达 式从左至右按顺序求值,而且试图获取匹配该模式的尽可能多的字符。

在之前的示例中,使用 “.+”获取从字符串起始位置开始的全部单个字符,包括所期望的第一个整数字段。\d+仅仅需 要一个数字,因此将得到“4”

其中.+匹配了从字符串起始部分到所期望的第一个数字的全部 内容:

Thu Feb 15 17:46:04 2007::uzifzf@dpyivihw.gov::117159036

非贪婪模式

使用“非贪婪”操作符“?”。可以在“*”、“+”或者“?”之后使 用该操作符。该操作符将要求正则表达式引擎匹配尽可能少的字符。因此,如果在“.+”之 后放置一个“?”,我们将获得所期望的结果

代码

import re
data = 'Thu Feb 15 17:46:04 2007::uzifzf@dpyivihw.gov::1171590364-6-8'
patt = '.+?(\d+-\d+-\d+)'