zoukankan      html  css  js  c++  java
  • 第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"一起学习交流

  • 相关阅读:
    三大主流负载均衡软件对比(LVS+Nginx+HAproxy)
    nginx 提示the "ssl" directive is deprecated, use the "listen ... ssl" directive instead
    centos安装nginx并配置SSL证书
    hadoop创建目录文件失败
    The server time zone value 'EDT' is unrecognized or represents more than one time zone.
    脚本启动SpringBoot(jar)
    centos做免密登录
    数据库远程连接配置
    Bash 快捷键
    TCP三次握手四次断开
  • 原文地址:https://www.cnblogs.com/ityouknow/p/12993244.html
Copyright © 2011-2022 走看看