发表于: 2018-01-17 21:21:23

1 937


今天完成的事情:今天继续系统学习Python中的正则表达式的后续相关知识


正则表达式(三)


6、re模块的内置对象

  其实在上一日报中的“常用功能函数”中已经罗列出了re的内置对象,即 SRE_Pattern 对象 和 SRE_Match 对象。这里主要是进一步学习一下这两个对象的一些主要属性和函数的使用方法。


(1)SRE_Pattern 对象

描述:这个对象是一个编译后的正则表达式,编译后能够复用和提升效率,也包含有关正则表达式的其他信息

属性这个对象有 flags、groupindex、groups、pattern 等属性。

  • flags         编译时指定的模式
  • groupindex    以正则表达式中有别名的组的别名为键、以该组对应的编号为值的字典,没有别名的组不包含在内。
  • groups        正则表达式中分组的数量
  • pattern       编译时用的正则表达式

函数:包括上一日报中的常用功能函数 findall、finditer、match、search、split、sub、subn 等。

import re
s = "Hello, Mr.Gumby : 2018/01/17"
p = re.compile("""(?:               # 构造一个不捕获分组,用于使用 |
             (?P<name>\w+\.\w+)    # 匹配 Mr.Gumby
             |                     #
             (?P<no>\s+\.\w+)      # 一个匹配不到的命名分组
             )
             .*?                   # 匹配  :
             (\d+)                 # 匹配 2018
             """, re.X)
print("1---", p.flags)
print("2---", p.groupindex)
print("3---", p.groups)
print("4---", p.pattern)

运行结果如下:

1--- 96

2--- {'name': 1, 'no': 2}

3--- 3

4--- (?:                                           # 构造一个不捕获分组 用于使用 |

              (?P<name>\w+\.\w+)    # 匹配 Mr.Gumby

              |                                        # 或

              (?P<no>\s+\.\w+)           # 一个匹配不到的命名分组

              )

              .*?                                     # 匹配  : 

              (\d+)                                 # 匹配 2018


(2)SRE_Match 对象

描述:这个对象会保存本次匹配的结果,包含很多关于匹配过程以及匹配结果的信息。

属性:这个对象包含 endpos、lastgroup、lastindex、pos、re、regs、string 等属性。

  • endpos       本次搜索结束位置索引
  • lastgroup    本次搜索匹配到的最后一个分组的别名
  • lastindex    本次搜索匹配到的最后一个分组的索引
  • pos          本次搜索开始位置索引
  • re           本次搜索使用的 SRE_Pattern 对象
  • regs         列表,元素为元组,包含本次搜索匹配到的所有分组的起止位置
  • string       本次搜索操作的字符串

import re
s = "Hello, Mr.Gumby : 2018/01/17"
m = re.search(", (?P<name>\w+\.\w+).*?(\d+)", s)
print("1---", m.endpos)
print("2---", m.lastgroup)
print("3---", m.lastindex)
print("4---", m.pos)
print("5---", m.re)
print("6---", m.regs)
print("7---", m.string)

运行结果如下:

1--- 28

2--- None

3--- 2

4--- 0

5--- re.compile(', (?P<name>\\w+\\.\\w+).*?(\\d+)')

6--- ((5, 22), (7, 15), (18, 22))

7--- Hello, Mr.Gumby  :  2018/01/17


函数
:这个对象包含 start、end、span、expand、group、groups、groupdict 等函数。

  • start([group])               返回指定分组的开始位置,默认返回正则表达式所匹配到的第一个字符的索引
  • end([group=0])            返回指定分组的结束位置,默认返回正则表达式所匹配到的最后一个字符的索引
  • span([group]              返回指定分组的起止位置组成的元组,默认返回由 start() 和 end() 组成的元组

  • expand(template)        根据模板返回相应的字符串,类似于 sub 函数里的 repl, 可使用 \1 或 \g<name> 来选择分组

  • group([group1, ...])      根据索引或名字返回相应分组的内容,默认返回 start 到 end 间的字符串, 多参数时返回一个元组
  • groups([default=None])        以元组形式返回每个分组匹配到的字符串,包括没有参与匹配的分组,其值为 default
  • groupdict([default=None])    返回包含所有匹配到的命名分组的字典,没有命名的分组不包含在内,key 为组名, value 为匹配到的内容,参数 default 为没有参与本次匹配的命名分组提供默认值

import re
s = "Hello, Mr.Gumby : 2018/01/17"
m = re.search("""(?:              # 构造一个不捕获分组,用于使用 |
             (?P<name>\w+\.\w+)  # 匹配 Mr.Gumby
             |                   #
             (?P<no>\s+\.\w+)    # 一个匹配不到的命名分组
             )
             .*?                 # 匹配  :
             (\d+)               # 匹配 2018
             """, s, re.X)
print("1---", m.start(3))
print("2---", m.end())
print("3---", m.span(3))
print("4---", m.expand("my name is \\1"))
print("5---", m.group())
print("6---", m.group(1,2))
print("7---", m.groups('default_string'))
print("8---", m.groupdict('default_string'))

运行结果如下:

1--- 18

2--- 22

3--- (18, 22)

4--- my name is Mr.Gumby

5--- Mr.Gumby : 2018

6--- ('Mr.Gumby', None)

7--- ('Mr.Gumby', 'default_string', '2018')

8--- {'name': 'Mr.Gumby', 'no': 'default_string'}


今天就先整理这两个内置对象,在上面的代码示例中,都用到了分组。对于分组的具体用法,明天再具体深入学习吧。(待续中)



返回列表 返回列表
评论

    分享到