通过查看re模块函数的原型可以发现,函数参数几乎都有flags参数,该参数用于设置匹配的附加选项。例如,是否忽略大小写、是否支持多行匹配等。常用的re模块规则选项如下所示:
I或IGNORECASE 忽略大小写
L或LOCALE 字符集本地化,用于多语言环境
M或MULTILINE 多行匹配
S或DOTALL 使.匹配包括\n在内的所有字符
X或VERBOSE 忽略正则表达式中的空白、换行,方便添加注释
U或UNICODE \w、\W、\b、\B、\d、\D、\s和\S都将使用Unicode
通过一个忽略大小写的实例看下用法:
>>> import re
>>> Str='Python:Java:C'
>>> re.match(r'python',Str) #匹配失败
>>> re.match(r'python',Str,re.I) #加re.I,匹配成功
<_sre.SRE_Match object at 0x00000000060D7D98>
2、re.compile() 函数
正则表达式的解析非常耗时,如果多次使用findall()的方式匹配字符串搜索效率可能比较低。如果多次使用同一规则匹配字符串,可以使用compile()进行预编译,compile函数返回1个pattern对象。该对象拥有一系列方法用于查找、替换或扩展字符串,从而提供字符串的匹配速度。patter对象的属性和方法如下
pattern #获取当前使用的正则表达式
match(string,flags=0) #同re.match()
search(string,flags=0) #同re.searc()
findall(string,flags=0) #查找所有符合pattern对象匹配条件的结果,返回1个包含匹配结果的列表。
finditer(string,flags=0) #返回一个包含匹配结果的地址
另外,函数compile()通常与match()、search()、group()一起使用对含有分组的正则表达式进行解析。正则表达式的分组从左往右开始计数,第1个出现的圆括号标记为第1组,依次类推。此外还有0号组,0号组用于存储匹配整个正则表达式的结果。match()和search()将返回一个match对象,match对象提供了一系列的方法和属性来管理匹配的结果。match对象的方法和属性如下:
group(index=0) #某个分组的匹配结果。默认匹配整个正则表达式
groups() #所有分组的匹配结果,每个分组的结果组成1个列表返回
举例,匹配身份证号码并获取身份证中的年、月、日信息。
>>> regex = r'[1-9][0-9]{5}(\d{4})(\d{2})(\d{2})[0-9]{3}[0-9X]'
>>> Str = '11010019950807532X'
>>> p = re.compile(regex)
>>> m = p.match(Str)
>>> m.groups()
('1995', '08', '07')
>>> m.group(1)
'1995'
>>> m.group(2)
'08'
>>> m.group(3)
'07'
典型实例
1、多关键字任一匹配查找
>>> import re
>>> regex = r'Python|Java|C'
>>> Str1 = 'Hello Java,Python Developer'
>>> p = re.compile(regex)
>>> p.findall(Str1)
['Java', 'Python']
说明:regex中的Python、Java、C表达式都可以单独作为一个匹配关键词在字符串中进行查找。也就是它们之间是 或 的关系。
2、提取字符串中的手机号码,手机号前缀为136,长度11位。
>>> import re
>>> Str = '13612345678,1361234567,123a2345678,136 12345678,13712345678,13687654321'
>>> regex = r'136\d{8}'
>>> p = re.compile(regex)
>>> num_lst = p.findall(Str)
>>> print num_lst
['13612345678', '13687654321']
3、利用分组命名,提取字符串中的内容
>>> import re
>>> Str = 'Learn 1998-07-12,Practice 1999-09-09,Complete 2000-01-01'
>>> regex = r'(?P<year>[1-9]\d{3})-(?P<month>\d{2})-(?P<day>\d{2})'
>>> p = re.compile(regex)
>>> m = p.search(Str)
>>> print m.group('year')
1998
>>> print m.group('month')
07
>>> print m.group('day')
12