• 第63天:正则表达式


    by 某某白米饭

    正则表达式是一个特殊的字符串序列、一种模式,用来判断字符串是否符合这种模式,如:判断邮件地址是否有 @ 符号,判断手机号是否正确等待。

    基本语法

    在正则表达式中,可以使用 d 匹配数字,w 匹配数字和子母,. 可以匹配除了换行符之外的任意字符,s 匹配空白字符

    1d 可以匹配 1213

    aw 可以匹配 abac

    .abc 可以匹配 aabc~abc abc

    上面是单个字符匹配,要匹配长字符串在正则表达式中,用 + 表示匹配至少一个字符,用 ? 表示匹配0或1个字符,用 {n} 表示匹配n个字符,用 {n,m} 表示匹配n-m个字符

    test.+ 可以匹配 testPythontestPy,无法匹配 test

    test? 可以匹配 testest,无法匹配 testPython

    test.{6} 可以匹配 testPython,无法匹配 testPy

    test.{1,6} 可以匹配 testPythontestPy,无法匹配 test

    复杂的正则

    正则表达式可以更加的复杂:([A-Za-z0-9_-.]+)@([A-Za-z0-9_-.]+).([A-Za-z]{2,4})

    ( ):表示分组

    [ ]:表示在[ ]内的任意一个字符

    ([A-Za-z0-9_-.]+):表示以大写字母 [A-Z]、小写字母 [a-z]、数字 [0-9]、下划线 [_]、减号 [-]、点号 [.] 中的至少一个字符 [+] ,在正则表达式中减号 [-] 和点号 [.] 是特殊字符需要使用 [] 转义

    @:邮件中的@符号

    ([A-Za-z0-9_-.]+):表示以大写字母 [A-Z]、小写字母 [a-z]、数字 [0-9]、下划线 [_]、减号 [-]、点号 [.] 中的至少一个字符 [+],如:qq,sina

    .([A-Za-z]{2,4}):表示以点号 [.] 连接2-4 [{2,4}] 个字符的大写字母 [A-Z] 和小写字母 [a-z]

    ([A-Za-z0-9_-.]+)@([A-Za-z0-9_-.]+).([A-Za-z]{2,4})可以匹配 abc@qq.comABCabc1234@qq.comabc_123-xyz@sina.cn

    Python中的正则表达式

    匹配

    在Python中提供了包含了所有正则表达式功能的 re 模块,用 re 中的match()函数判断是否匹配成功,如果匹配成功则返回 Match 对象,否则返回 None ,在 Python 中字符串用 转义,使用 r 前缀可以不用考虑转义的问题

    >>> import re
    >>> re.match(r'1d', '13')
    <re.Match object; span=(0, 2), match='13'>   # 匹配成功返回Match对象
    >>> re.match(r'1d', '23') # 匹配失败返回None
    >>> 
    

    分组

    在爬虫中一般需要提取出匹配成功的子字符串。用 ( ) 分组就可以提取出子字符串比如上面的邮件正则表达式,在Python中使用 Match 对象的 group() 函数提取出子字符串,groups() 函数返回所有子字符串的元组

    ([A-Za-z0-9_-.]+)@([A-Za-z0-9_-.]+).([A-Za-z]{2,4}) 定义了3个组,可以提取出 @ 符之前的字符串和域名

    >>> email = re.match(r'([A-Za-z0-9_-.]+)@([A-Za-z0-9_-.]+).([A-Za-z]{2,4})', 'abc@qq.com')
    >>> email.group(0)
    'abc@qq.com'
    >>> email.group(1)
    'abc'
    >>> email.group(2)
    'qq'
    >>> email.group(3)
    'com'
    

    group() 函数中group(0)永远是字符串本身,group(1)group(2)group(3) ...表示第一、第二、第三...个子字符串。

    替换

    re 模块中提供了 sub() 函数替换子字符串的内容

    # 删除字符串中的空格
    >>> test = '021- 1101101 10'
    >>> re.sub(r's','',test)
    '021-110110110'
    

    sub() 函数中被替换的字符串也可以使用函数

    import re
    
    # 把数字加上100
    def num(match):
        value = int(match.group('num'))
        return str(value + 100)
    
    test = 'abc12defg980'
    result = re.sub(r'(?P<num>d+)', num, test)
    print(result)
    

    编译

    在使用 re 模块的时候,Python 帮我们做了两件事:

    1. 编译正则表达式,如果正则表示不合法会报错
    2. 用编译后的正则表示匹配字符串

    re 模块中可以使用 compile() 函数预编译正则表示

    >>> import re
    >>> test = re.compile(r'test(.{1,6})')
    >>> test.match('testPy').groups()
    ('Py',)
    >>> test.match('testPython').groups()
    ('Python',)
    

    compile() 函数构造出来的是一个 Pattern 对象。提供了一些属性读取正则表达的相关信息。

    1. pattern:编译的正则表达式
    2. groups:表达式中的分组数量
    3. flags:编译时的匹配模式
    >>> test = re.compile(r'test(.{1,6})')
    >>> test.pattern
    'test(.{1,6})'
    >>> test.groups
    1
    >>> test.flags
    32
    

    总结

    正则表达式非常的强大,这里只介绍了它的一小部分内容,让大家对正则表达式的概念和使用有一个清晰的了解。

    示例代码:Python-100-days-day063

    关注公众号:python技术,回复"python"一起学习交流

  • 相关阅读:
    协议详解1——概要
    协议学习之 vamei博客系列 总结
    DDOS介绍
    python基础教程总结15——7 自定义电子公告板
    python基础教程总结15——6 CGI远程编辑
    python基础教程总结15——5 虚拟茶话会
    python基础教程总结15——4 新闻聚合
    python基础教程总结15——3 XML构建网址
    如何在远程桌面的服务器上访问本地磁盘
    C# 如何把dataTable以参数的形式传入 sql 存储过程
  • 原文地址:https://www.cnblogs.com/ityouknow/p/12993244.html
Copyright © 2020-2023  润新知