Python 之搜索、匹配与贪婪
本博客就简单的例子展开讨论,如令字符串 data = ‘Thu Feb 15 17:46:04 2007::nvur@jkpp.net::271591857-4-4’ ,需要与data信息中匹配出字符串 ‘271591857-4-4’ .
- 分析寻找的字符为三个由连字符分隔的整数,所以对正则表达式的需求之一:\d+-\d+-\d+ ; (正则式表示:任何数值的数字(至少一个)后面跟着一个连字符,然后是多个数字、另一个连字符,最后是一个数字集)
- 代码分析(1)–搜索search就可以直接匹配结果
data = 'Thu Feb 15 17:46:04 2007::nvur@jkpp.net::271591857-4-44'
patt1 = '\d+-\d+-\d+'
m1 = re.search(patt1,data)
结果得到:
271591857-4-44
但是match尝试失败,因为匹配是从字符串的起始部分开始,而要匹配的放在末尾。
- 代码分析 (2) – 使用 .+ 和match,使用惰性匹配, ‘.+\d+-\d+-\d+’ , “.+”获取从字符串起始位置开始的全部单个字符,此处要的并非整个字符串,使用圆括号对匹配的内容进行分组 .+(\d+-\d+-\d+)。
data = 'Thu Feb 15 17:46:04 2007::nvur@jkpp.net::271591857-4-44'
patt2 = '.+\d+-\d+-\d+'
patt3 = '.+(\d+-\d+-\d+)'
m2 = re.match(patt2,data)
m3 = re.match(patt3,data)
结果得到:
m2.group()='Thu Feb 15 17:46:04 2007::nvur@jkpp.net::271591857-4-44'
m3.group()= 7-4-44 #\d仅表示一个数,故匹配得到7
- 代码分析 (3) –使用非贪婪 “?”,该字符要求正则表达式引擎匹配尽可能少的字符,可以简单理解为 ?字符操作的字符部分不在结果中显示
data = 'Thu Feb 15 17:46:04 2007::nvur@jkpp.net::271591857-4-44'
patt4 = '.+?(\d+-\d+-\d+)'
m3 = re.match(patt4,data)
结果为:
271591857-4-44