美文网首页PythonPython
Python 正则表达式(四)

Python 正则表达式(四)

作者: 名本无名 | 来源:发表于2020-12-03 16:56 被阅读0次

    前言

    不知不觉,正则表达式已经来到了第四节啦!

    今天要聊点什么呢?嗯...

    对了,上节讲到的 匹配对象 ,好像提到过好几次,但是都没讲它是啥。

    抓紧时间,废话少说,今天就聊聊它吧。

    匹配对象

    介绍

    匹配对象,顾名思义就是匹配成功所返回的存储了匹配信息的对象

    如果没有匹配的话会返回 None

    所以你可以简单的用 if 语句来判断是否匹配。

    match()search() 匹配成功都会返回一个 匹配对象

    match = re.search(pattern, string)
    if match:
        process(match)
    

    常用方法和属性

    1、group

    介绍

    Match.group([group1, ...])

    返回一个或者多个匹配的子组。

    • 如果只有一个参数,结果就是一个字符串

    • 如果有多个参数,结果就是一个元组(每个参数对应一个项)

    • 如果没有参数,group1 参数默认等于 0(即返回整个匹配)

    • 如果一个组号是负数,或者大于样式中定义的组数,抛出一个 IndexError 索引错误。

    • 如果分组被命名, 那么 groupN 参数就可以是命名组合的名字

    • 如果一个组匹配了多次,就只返回最后一个匹配

    示例
    m = re.match(r"(\w+) (\w+)", "Lebron James, Kobe")
    
    m.group()
    # out: 'Lebron James'
    m.group(0)
    # out: 'Lebron James'
    m.group(1)
    # out: 'Lebron'
    m.group(2)
    # out: 'James'
    m.group(1, 2)
    # out: ('Lebron', 'James')
    m.group(3)
    # out: 'IndexError: no such group'
    
    # 命名分组
    m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Lebron James")
    m.group('first_name')  # ==> m.group(1)
    # out: 'Lebron',依旧可以使用数字索引
    m.group('last_name')   # ==> m.group(2)
    # out: 'James'
    
    # 多次匹配,返回最后一个匹配
    m = re.match(r"(..)+", "aabbcc")
    m.group(1)
    # out: 'cc'
    

    其实,上述 group(n) 可以直接通过 m[n] 获取

    m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Lebron James")
    m[0]
    # out: 'Lebron James'
    m[1]
    # out: 'Lebron'
    m[2]
    # out: 'James'
    

    2、groups

    介绍

    Match.groups(default=None)

    返回一个包含所有匹配子组的元组,

    default 参数设置匹配不成功时的返回值,默认为 None

    示例
    m = re.match(r"(\d+)\.(\d+)", "3.1415926")
    m.groups()
    # out: ('3', '1415926')
    
    # 设置未匹配的返回值
    m = re.match(r"(\d+)\.?(\d+)?", "345")
    m.groups()
    # out: ('345', None)
    m.groups(-1)
    # out: ('345', -1)
    

    3、groupdict

    介绍

    Match.groupdict(default=None)

    返回一个字典,包含了所有的命名分组,key 就是组名。

    default 参数同上。

    如果分组未命名,则返回空字典

    示例
    m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Lebron James")
    m.groupdict()
    # out: {'first_name': 'Lebron', 'last_name': 'James'}
    

    4、start 和 end

    介绍

    Match.start([group])

    Match.end([group])

    返回 group 匹配到的字串的开始和结束索引。

    group 默认为 0(意思是整个匹配的子串)。

    如果 group 存在,但未匹配到,就返回 -1

    示例
    m = re.match(r"(\w+) (\w+)", "Lebron James, Kobe")
    m.start(), m.end()
    # out: (0, 12)
    m.start(1), m.end(1)
    # out: (0, 6)
    m.start(2), m.end(2)
    # out: (7, 12)
    
    string = "Lebron James, Kobe"
    m.group(1) == string[m.start(1): m.end(1)]
    # out: True
    

    5、span

    介绍

    Match.span([group])

    对于一个匹配 m ,返回一个二元组 (m.start(group), m.end(group))

    注意:如果 group 没有在这个匹配中,就返回 (-1, -1)

    group 默认为 0,就是整个匹配。

    示例
    m = re.match(r"(\w+) (\w+)", "Lebron James, Kobe")
    m.span()
    # out: (0, 12)
    

    6、属性

    Match.re: 返回产生这个实例的正则表达式对象

    Match.string: 传递到 match()search() 的字符串

    m = re.match(r"(\w+) (\w+)", "Lebron James, Kobe")
    m.string
    # out: 'Lebron James, Kobe'
    m.re
    # out: re.compile(r'(\w+) (\w+)', re.UNICODE)
    

    讲到这,我们就把下面要说的内容引出来了。

    是的,没错,正是正则表达式对象

    什么是正则表达式对象

    正则表达式对象

    正则表达式字符串经过编译后,就是正则表达式对象了。

    通过 compile 方法编译将正则表达式的样式编译为一个正则表达式对象

    如果需要多次使用这个正则表达式的话,用 re.compile() 保存这个正则对象以便复用,可以让程序更加高效。

    re.compile(pattern, flags=0)
    # pattern: 传入的正则样式
    # flags: 指定匹配模式,如 re.MULTILINE 等
    
    prog = re.compile(pattern)
    result = prog.match(string)
    
    # 等价于
    result = re.match(pattern, string)
    

    正则表达式对象支持以下方法和属性

    1、search

    介绍

    Pattern.search(string[, pos[, endpos]])

    扫描整个 字符串 找到匹配样式的第一个位置,并返回一个相应的 匹配对象

    如果没有匹配到,就返回 None

    可选的第二个参数 pos 指定字符串中开始搜索的位置索引,默认为 0

    可选参数 endpos 限定了字符串搜索的结束位置

    p.search(string, pos, endpos) 等价于 p.search(string[pos:endpos], 0)

    p = re.compile("dog")
    
    m = p.search('a dog')
    m.group()
    # out: 'dog'
    
    m = p.search('a dog', 3)
    m # None
    
    m = p.search('a dog', 2, 5)
    m.group()
    # out: 'dog'
    

    2、match

    介绍

    Pattern.match(string[, pos[, endpos]])

    如果从 string 的开始位置能够匹配到这个正则样式,就返回一个相应的匹配对象。

    如果不匹配,就返回 None

    可选参数 posendpossearch() 含义相同。

    示例

    p = re.compile("aaa")
    m = p.match("hello aaa bbb")
    m
    # m is None
    m = p.match("hello aaa bbb", 6)
    m.group()
    # out: 'aaa'
    

    小结

    其他正则对象的方法与 re 模块的方法大同小异。

    只是加了 posendpos 两个参数来限制搜索范围

    就不在重复讲啦!

    总结

    Python 正则表达式讲到这,已经差不多都讲完了。

    学完这些,应该多找几个例子自己练练手,加深印象。

    建议可以从网上随便下一个网站的源码,然后用 re 模块从源码中提取相应的信息

    再建议,想不到什么网站的话,可以下载豆瓣电影排行榜网页源码,提取相应的电影信息

    再再建议,前面的建议都动手做一下吧。

    纸上得来终觉浅,绝知此事要躬行。

    相关文章

      网友评论

        本文标题:Python 正则表达式(四)

        本文链接:https://www.haomeiwen.com/subject/cwamwktx.html