Python正则表达式(二)

86 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

compile filter findall

首先复习一下上次说的内容

import re


# 将匹配的数字乘以 2
def double(matched):
    value = int(matched.group('value'))
    return str(value * 2)


s = 'M23G4HFR567'
print(re.sub('(?P<value>\d+)', double, s))

怎么理解上面的re.sub呢,其实这里面的三个参数是这样理解,在S中根据'(?P<value>\d+)'这个规则去匹配,每匹配成功一次,调用一次double这个函数,并把matched参数传过去,也就是匹配成功的返回值 result = re.match(......)就是这里的result, 然后通过group分组获取vaule的值,可以将这段代码复制下来运行一下

compile

有些地方我们经常遇到 re.compile(参数1, 参数2)这种写法,这个方法其实就是为了生成一个正则表达式的对象,这个函数里面包含两个参数

  • 1,参数表示一个字符串形式的正则表达式
  • 2:可选参数,辅助参数
    • re.I 忽略大小写
    • re.L 表示特殊字符集 \w \W \b \b \s \S
    • re.M 多行模式
    • re.S 表示包括换行符在内的任意字符 ( .不包括换行符)
    • re.U表示特殊字符集

使用说明

    # re.I 表示忽略大小写
    pattern = re.compile("([a-z]+) ([a-z]+)",re.S)
    m = pattern.match('jsd fk5343adsadasd33543')
    print(m.group())

以上也就是基本的介绍了

这里补充一点,其实match有一个使用方法之前还没有介绍

pattern.match("ajsdkjasdjksa", 3, 8) #表示的从其中某一段开始匹配

findall 使用

findall是在相关的字符串中进行查找,返回一个列表。如果没有匹配到任何一个字符串,则返回一个空的列表,match是匹配一次, findall是匹配所有。

    # re.S 表示包括换行符在内的所有字符
    pattern = re.compile("\d+", re.S)
    result = pattern.findall("abd12asnd5asd55ad44")
    print(result)
    # 打印结果: ['12', '5', '55', '44']

finditer

这个方法其实和findall很类似的一个方法,他匹配后将返回一个迭代器,需要用户去遍历

    result = re.finditer(r"\d+", "abd12235asnd5asd55ad44")
    for it in result:
        print(it.group())
    # 打印结果: 
    # '12',
    #  '5', 
    # '55', 
    # '44'

re.split的使用

    res = re.split('\W+', 'runoob, runoob, runoob.')
    print(res)
    # 打印结果
    # ['runoob', 'runoob', 'runoob', '']
    # 很奇怪为什么会显示这样结果呢,这么会有一个空的字符串呢

其实在这里我们可以想象一把菜刀在两个逗号和一个点号中间切一刀,这样出来的结果就会出来一个空的元素

  • 如果出现第三个参数则表示切割多少次,例如('\W+', 'runoob, runoob, runoob.', 1),这里的1表示切割一次

  • 如果第四个参数存在则表示是否区分大小写,特殊字符等参数,和上面的参数功能一致

实例描述
.匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
\d匹配一个数字字符。等价于 [0-9]。
\D匹配一个非数字字符。等价于 [^0-9]。
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。

这些常用的我们必须要掌握

属性介绍

正则匹配后我们需要对相关的属性进行操作以下是一些基本的属性介绍

    m = re.match(r'(\w+) (\w+)(?P<name>.*)', 'hello python!')
    print("匹配时所用的文本 strng -------", m.string)
    print("Pattern对象 re -------", m.re)
    print("开始搜索的索引 pos -------", m.pos)
    print("结束搜索的索引 endpos -------", m.endpos)
    print("最后一个被捕获的别名 lastgroup -------", m.lastgroup)
    # 不写参数表示0 也就是全部匹配的字符串
    print("截获分组 group -------", m.group())
    print("截获第一个分组 group -------", m.group(1))
    print("截获第二个分组 group -------", m.group(2))
    # 截获两个分组,以元组的形式打印出来
    print("截获第一 二个分组 group -------", m.group(1,2))
    print("截获所有的分组元组的形式打印 groups -------", m.groups())
    print("返回有别名的字典形式 groupdict -------", m.groupdict())
    print("返回指定截获的字符串首索引 start -------", m.start(2))
    print("返回指定截获的字符串尾索引 end -------", m.end(2))
    print("返回指定截获的字符串索引区间 span -------", m.span(2))
    print("将匹配到的分组代入template中然后返回\10表示第10个分组 expand -------", m.expand(r'\2 \1\3'))
    '''
    Pattern对象 re ------- re.compile('(\\w+) (\\w+)(?P<name>.*)')
    开始搜索的索引 pos ------- 0
    结束搜索的索引 endpos ------- 13
    最后一个被捕获的别名 lastgroup ------- name
    截获分组 group ------- hello python!
    截获第一个分组 group ------- hello
    截获第二个分组 group ------- python
    截获第一 二个分组 group ------- ('hello', 'python')
    截获所有的分组元组的形式打印 groups ------- ('hello', 'python', '!')
    返回有别名的字典形式 groupdict ------- {'name': '!'}
    返回指定截获的字符串首索引 start ------- 6
    返回指定截获的字符串尾索引 end ------- 12
    返回指定截获的字符串索引区间 span ------- (6, 12)
    将匹配到的分组代入template中然后返表示第10个分组 expand ------- python hello!
    '''