一、re模块匹配时贪婪和非贪婪模式
正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪则相反,总是尝试匹配尽可能少的字符。在”*”,”?”,”+”,”{m,n}”后面加上?,使贪婪变成非贪婪。
即:
.*具有贪婪的性质,首先匹配到不能匹配为止,根据后面的正则表达式,会进行回溯。
.*?则相反,一个匹配以后,就往下进行,所以不会进行回溯,具有最小匹配的性质。
例子如下:
>>> s="This is a number 234-235-22"
>>> r=re.match(".+(\d+-\d+-\d+)",s)
>>> r.group(1)
'4-235-22'
>>> r=re.match(".+?(\d+-\d+-\d+)",s)
>>> r.group(1)
'234-235-22'
#此外.group(0)返回原字符串
>>> r.group(0)
'This is a number 234-235-22'
二、re模块的属性和方法
re.compile(pattern[, flags])
把一个正则表达式pattern编译成正则对象,以便可以用正则对象的match和search方法。
得到的正则对象的行为(也就是模式)可以用flags来指定,值可以由几个下面的值OR得到。
以下两段内容在语法上是等效的:
#法1
>>> A = re.compile(pattern)
>>> result = prog.match(string)
#法2
>>> result = re.match(pattern, string)
#例子
>>> s="This is a number 234-235-22"
>>> r=re.match(".+?(\d+-\d+-\d+)",s)
>>> r.group(1)
'234-235-22'
>>> A=re.compile(r".+?(\d+-\d+-\d+)")
>>> r=re.match(A,s)
>>> r.group(1)
'234-235-22'
区别是,用了re.compile以后,正则对象会得到保留,这样在需要多次运用这个正则对象的时候,效率会有较大的提升。
搜索匹配区别
search与match工作方式不同,match()尝试从字符串起始处进行匹配,search()会检查参数字符串任意位置。
eg.
用字符串’foo’去匹配’seafood’,match()会失败,search()会成功。
四种方法比较
1.match
从首字母开始开始匹配,string如果包含pattern子串,则匹配成功,返回Match对象,失败则返回None,若要完全匹配,pattern要以$结尾。
2.search
若string中包含pattern子串,则返回Match对象,否则返回None,注意,如果string中存在多个pattern子串,只返回第一个。
3.findall
返回string中所有与pattern相匹配的全部字串,返回形式为数组。
4.finditer
返回string中所有与pattern相匹配的全部字串,返回形式为迭代器。