发表于: 2018-01-18 22:12:46
1 974
今天完成的事情:继续深入学习Python的正则表达式的后续相关知识
正则表达式(四)
7、分组
概念:分组,即分组匹配,也称为捕获组,是正则中的一种比较重要的匹配方式。
方法:用一对圆括号“()”括起来的正则表达式,匹配出来的内容就表示一个分组。从正则表达式的左边开始,按照每个分组中前半部分左括号 "(" 出现的顺序判定分组的索引,第一个左括号“(”表示第一个分组,索引为1,第二个表示第二个分组,索引为2,依次类推。需要注意的是,有一个隐含的全局分组(就是0),就是整个正则表达式。每个分组在访问的时候可以使用索引,也可以使用别名。
import re
s = "Hello, Mr.Gumby : 2018/01/18"
p = re.compile("(?P<name>\w+\.\w+).*?(\d+)(?#注释部分)")
m = p.search(s)
print("1---", m.group('name')) # 使用别名访问
print("2---", m.group(1)) # 使用分组访问
print("3---", m.group(2)) # 使用分组访问
print("4---", m.group()) # 默认全局分组
print("5---", m.group(0)) # 默认全局分组
运行结果如下:
1--- Mr.Gumby
2--- Mr.Gumby
3--- 2018
4--- Mr.Gumby : 2018
5--- Mr.Gumby : 2018
有时候可能只是为了把正则表达式分组,而不需要捕获其中的内容,这时候可以使用非捕获分组。非捕获分组将跳过分组索引,即不计入分组计算。
另外,如果在写正则的时候需要在正则里面重复书写某个表达式,那么可以使用正则的引用分组功能。需要注意的是,引用的不是前面分组的正则表达式,而是捕获到的内容,因此引用的分组也不计算在分组总数中。
import re
s = "Hello, Mr.Gumby : 2018/2018/18"
p = re.compile("""
(?: # 构造不捕获分组,用于使用 |
(?P<name>\w+\.\w+)|(\d+)
)
.*?(?P<number>\d+)/(?P=number)/
""", re.X)
m = p.search(s)
print("1---", p.groups) # 非捕获分组及引用分组不计入 SRE_Pattern 的分组计数
print("2---", m.groups()) # 非捕获分组及引用分组不计入 SRE_Match 的分组
print("3---", m.group(1)) # 使用分组访问
print("4---", m.group(2)) # 使用分组访问
print("5---", m.group(3)) # 使用分组访问
运行结果如下:
1--- 3
2--- ('Mr.Gumby', None, '2018')
3--- Mr.Gumby
4--- None
5--- 2018
8、环视
概念:环视是一种特殊的正则语法,它匹配的不是字符串,而是位置,其实就是使用正则来说明,这个位置的左右应该是什么,或者应该不是什么,然后去寻找这个位置。环视还有其他的名字,例如:界定、断言、预搜索等,叫法不一。
用法:有限定的环视共有四种,用法如下:
- (?=...) 顺序肯定环视,表示所在位置右侧能够匹配括号内正则
- (?!...) 顺序否定环视,表示所在位置右侧不能匹配括号内正则
- (?<=...) 逆序肯定环视,表示所在位置左侧能够匹配括号内正则
- (?<!...) 逆序否定环视,表示所在位置左侧不能匹配括号内正则
import re
s = 'Hello, Mr.Gumby : 2018/01/18 Hello,r.Gumby : 2018/01/18'
# 无限定的环视
print("1---", re.compile("(?P<name>\w+\.\w+)").findall(s))
# 顺序肯定环视 左边为 "Hello, "
print("2---", re.compile("(?<=Hello, )(?P<name>\w+\.\w+)").findall(s))
# 顺序否定环视 左边不为 ","
print("3---", re.compile("(?<!,)(?P<name>\w+\.\w+)").findall(s))
# 逆序肯定环视 右边为 "M"
print("4---", re.compile("(?=M)(?P<name>\w+\.\w+)").findall(s))
# 逆序否定环视 右边不为 r
print("5---", re.compile("(?!r)(?P<name>\w+\.\w+)").findall(s))
运行结果如下:
1--- ['Mr.Gumby', 'r.Gumby']
2--- ['Mr.Gumby']
3--- ['Mr.Gumby']
4--- ['Mr.Gumby']
5--- ['Mr.Gumby']
至此,Python的正则表达式中 re 模块的相关知识全部整理完毕。
评论