python中re模块简析
re的分组功能
python的re模块有一个分组功能。所谓的分组就是去已经匹配到的内容里面再筛选出需要的内容,相当于二次过滤。
实现分组靠圆括号(),而获得分组的内容靠的是group(),groups(),groupdict()方法。
re模块里的几个重要方法在分组上,有不同的表现形式,需要区别对待。
re实例
match()方法
不分组时的情况:
import reorigin = "hasdfi123123safd"# 不分组时的情况r = re.match("h\w+", origin)print(r.group()) # 获取匹配到的整体结果print(r.groups()) # 获取模型中匹配到的分组结果元组print(r.groupdict()) # 获取模型中匹配到的分组中所有key的字典结果:hasdfi123123safd(){}
有分组的情况(注意圆括号!)
import reorigin = "hasdfi123123safd123"# 有分组r = re.match("h(\w+).*(?P\d)$", origin)print(r.group()) # 获取匹配到的整体结果print(r.group(1)) # 获取匹配到的分组1的结果print(r.group(2)) # 获取匹配到的分组2的结果print(r.groups()) # 获取模型中匹配到的分组结果元组print(r.groupdict()) # 获取模型中匹配到的分组中所有key的字典执行结果:hasdfi123123safd123asdfi123123safd123('asdfi123123safd12', '3'){'name': '3'}
说明⚠️:
(1)正则表达式
h(\w+).*(?P<name>\d)$
中有2个小括号,表示它分了2个小组,在匹配的时候是拿整体的表达式去匹配的,而不是拿小组去匹配的。(2)
(\w+)
表示这个小组内是1到多个字母数字字符,相当于匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'
。(3)
(?P<name>\d)
中?P<name>
是个正则表达式的特殊语法,表示给这个小组取了个叫"name"的名字,?P<xxxx>
是固定写法。\d
匹配一个数字字符。等价于[0-9]
。- (4)在获取分组值的时候,group()和group(0)是对等的,都表示整个匹配到的字符串,从group(1)开始,分别是从左往右的小组序号,按位置顺序来。
search()方法
有分组的情况:
import reorigin = "sdfi1ha23123safd123" # 注意这里对匹配对象做了下调整# 有分组r = re.search("h(\w+).*(?P\d)$", origin)print(r.group()) print(r.group(0)) print(r.group(1)) print(r.group(2))print(r.groups()) print(r.groupdict()) 执行结果:ha23123safd123ha23123safd123a23123safd123('a23123safd12', '3'){'name': '3'}
说明⚠️:表现得和match()方法基本一样。
match()方法与search()方法区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
举例如下:
#!/usr/bin/pythonimport reline = "Cats are smarter than dogs";matchObj = re.match( r'dogs', line, re.M|re.I)if matchObj: print "match --> matchObj.group() : ", matchObj.group()else: print "No match!!"matchObj = re.search( r'dogs', line, re.M|re.I)if matchObj: print "search --> matchObj.group() : ", matchObj.group()else: print "No match!!"
以上代码执行结果如下:
No match!!search --> matchObj.group() : dogs
扩展
正则表达式实例:
#!/usr/bin/pythonimport reline = "Cats are smarter than dogs"matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)if matchObj: print "matchObj.group() : ", matchObj.group() print "matchObj.group(1) : ", matchObj.group(1) print "matchObj.group(2) : ", matchObj.group(2)else: print "No match!!"
说明⚠️:关于正则表达式r'(.*) are (.*?) .*'
(1)首先,这是一个字符串,前面的一个 r 表示字符串为非转义的原始字符串,让编译器忽略反斜杠,也就是忽略转义字符。但是这个字符串里没有反斜杠,所以这个 r 可有可无。
(2)(.) 第一个匹配分组,. 代表匹配除换行符之外的所有字符。
(3)(.?) 第二个匹配分组,.? 后面多个问号,代表非贪婪模式,也就是说只匹配符合条件的最少字符。
(4)后面的一个 .* 没有括号包围,所以不是分组,匹配效果和第一个一样,但是不计入匹配结果中。
(5)matchObj.group() 等同于 matchObj.group(0),表示匹配到的完整文本字符
matchObj.group(1) 得到第一组匹配结果,也就是(.*)匹配到的
matchObj.group(2) 得到第二组匹配结果,也就是(.*?)匹配到的
因为只有匹配结果中只有两组,所以如果填 3 时会报错。
参考文档
刘江python教程
python正则表达式01-re
- python正则表达式02-re