发表于: 2018-01-18 22:12:46

1 838


今天完成的事情:继续深入学习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 模块的相关知识全部整理完毕。


返回列表 返回列表
评论

    分享到