python的re模块有一个分组功能。所谓的分组就是去已经匹配到的内容里面再筛选出须要的内容,至关于二次过滤。html
实现分组靠圆括号(),而得到分组的内容靠的是group(),groups(),groupdict()方法。python
re模块里的几个重要方法在分组上,有不一样的表现形式,须要区别对待。正则表达式
import re origin = "hasdfi123123safd" # 不分组时的状况 r = re.match("h\w+", origin) print(r.group()) # 获取匹配到的总体结果 print(r.groups()) # 获取模型中匹配到的分组结果元组 print(r.groupdict()) # 获取模型中匹配到的分组中全部key的字典 结果: hasdfi123123safd () {}
import re origin = "hasdfi123123safd123" # 有分组 r = re.match("h(\w+).*(?P<name>\d)$", origin) print(r.group()) # 获取匹配到的总体结果 print(r.group(1)) # 获取匹配到的分组1的结果 print(r.group(2)) # 获取匹配到的分组2的结果 print(r.groups()) # 获取模型中匹配到的分组结果元组 print(r.groupdict()) # 获取模型中匹配到的分组中全部key的字典 执行结果: hasdfi123123safd123 asdfi123123safd12 3 ('asdfi123123safd12', '3') {'name': '3'}
说明⚠️:express
(1)正则表达式h(\w+).*(?P<name>\d)$
中有2个小括号,表示它分了2个小组,在匹配的时候是拿总体的表达式去匹配的,而不是拿小组去匹配的。ide
(2)(\w+)
表示这个小组内是1到多个字母数字字符,至关于匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'
。函数
(3)(?P<name>\d)
中?P<name>
是个正则表达式的特殊语法,表示给这个小组取了个叫“name”的名字,?P<xxxx>
是固定写法。\d
匹配一个数字字符。等价于[0-9]
。code
import re origin = "sdfi1ha23123safd123" # 注意这里对匹配对象作了下调整 # 有分组 r = re.search("h(\w+).*(?P<name>\d)$", origin) print(r.group()) print(r.group(0)) print(r.group(1)) print(r.group(2)) print(r.groups()) print(r.groupdict()) 执行结果: ha23123safd123 ha23123safd123 a23123safd12 3 ('a23123safd12', '3') {'name': '3'}
说明⚠️:表现得和match()方法基本同样。htm
re.match只匹配字符串的开始,若是字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。对象
举例以下:blog
#!/usr/bin/python import re line = "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/python import re line = "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 时会报错。