• python之正则表达式的使用


    一、re模块的使用

    python中使用正则表达式,需要用到re模块来进行操作,Re库常用的功能函数

    1、re.match函数

    参数说明:接收两个参数,

    • 第一个是匹配的规则,
    • 第二个是匹配的目标字符串,

    re.match尝试从字符串的起始位置匹配一个模式,匹配成功 返回的是一个匹配对象(这个对象包含了我们匹配的信息),如果不是起始位置匹配成功的话,match()返回的就是空

    import re
    s = '12356python123456'
    print(re.match(r'123',s))
    print(re.match(r'1236',s))
    print(re.match(r'1234',s))
    print(re.match(r'python',s))
    
    
    打印结果:
    <_sre.SRE_Match object; span=(0, 3), match='123'>
    None
    None
    None
    

      

    2、re.search方法

    参数说明:接收两个参数,

    • 第一个是匹配的规则,
    • 第二个是匹配的目标字符串,

    re.search 扫描整个字符串并返回第一个成功的匹配.【匹配多个符合要求的字符,只返回第一个满足条件的】

    import re
    s = '12356python123456'
    print(re.search(r'123',s))
    print(re.search(r'1236',s))
    print(re.search(r'1234',s))
    print(re.search(r'python',s))
    
    
    打印结果:
    <_sre.SRE_Match object; span=(0, 3), match='123'>
    None
    <_sre.SRE_Match object; span=(11, 15), match='1234'>
    <_sre.SRE_Match object; span=(5, 11), match='python'>
    
    Process finished with exit code 0
    

      

    re.match与re.search的区别
    
    re.match从字符串的开始位置进行匹配,如果字符串开始不符合正则表达式,则匹配失败,函数返回空;
    而re.search匹配整个字符串,直到找到一个匹配成功的则进行返回,如果整个字符串中都没有找到匹配成功的,则返回空
    

      

    3、findall方法

    参数说明:接收两个参数,

    • 第一个是匹配的规则,
    • 第二个是匹配的目标字符串,

    在字符串中找到正则表达式所匹配的所有子串并返回一个列表,如果没有找到匹配的,则返回空列表。

    import re
    
    s = '12356python123456'
    print(re.findall(r'123', s))  # ['123', '123']
    print(re.findall(r'1236', s))  # []
    print(re.findall(r'1234', s))  # ['1234']
    print(re.findall(r'python', s))  # ['python']
    

      

     注意: match 和 search 是匹配一个结果, findall 匹配处所有符合规则的结果。
    

     

    4、sub方法

    替换字符串中的某些字符,可以用正则表达式来匹配被选子串。

    re.sub(pattern, repl, string, count=0 )

    参数:
    • pattern:匹配的规则;
    • repl:匹配之后替换的新内容;
    • string:需要按规则替换的字符串;
    • count:替换的次数,可以不传参,默认替换所有符合规则的。
    import re
    
    s = '12356python123456python'
    print(re.sub(r'python','PYTHON', s))  # 12356PYTHON123456PYTHON
    print(re.sub(r'python','PYTHON', s,1))  # 12356PYTHON123456python
    print(re.sub(r'python','PYTHON', s,2))  # 12356PYTHON123456PYTHON
    

       5、贪婪模式说明:

    贪婪模式:Python里数量词默认是贪婪的,总是尝试匹配尽可能多的字符;
    import re
    
    s = '12356python123456python'
    # {m,n}表示n>m,匹配的位数
    print(re.search(r'\d{3,}', s))  # <_sre.SRE_Match object; span=(0, 5), match='12356'>
    print(re.search(r'\d{3,3}', s))  # <_sre.SRE_Match object; span=(0, 3), match='123'>
    print(re.search(r'\d{3,4}', s))  # <_sre.SRE_Match object; span=(0, 4), match='1235'>
    print(re.search(r'\d{3,5}', s))  # <_sre.SRE_Match object; span=(0, 5), match='12356'>
    print(re.search(r'\d{3,6}', s))  # <_sre.SRE_Match object; span=(0, 5), match='12356'>
    # 非贪婪模式:总是尝试匹配尽可能少的字符,在"*","?","+","{m,n}",{m,}后面加上?,可以关闭贪婪模式
    # 关闭贪婪模式之后,尽可能获取更少的,如下,只获取到最前面的3个数值(规则时至少3个,非贪婪就是匹配最前面符合规则的3个数组)
    print(re.search(r'\d{2,4}?', s))  # <_sre.SRE_Match object; span=(0, 2), match='12'>
    print(re.search(r'\d{3,4}?', s))  # <_sre.SRE_Match object; span=(0, 3), match='123'>
    

      

    6.re.split方法 

     

    split按照匹配的模式字串将字符串进行切分,返回切分后的字符串列表

    语法
    re.split(pattern, string[, maxsplit=0, flags=0])
    pattern:匹配的字符串
    string:需要切分的字符串
    maxsplit:分隔次数,默认为0(即不限次数)
    flags:标志位,用于控制正则表达式的匹配方式,比如:是否区分大小写,多行匹配等
    

      

    实例
    import re
    s='abc, abc, defg, dds'
    re.split('\W+',s)
    结果:
    ['abc', 'abc', 'defg', 'dds']
    其中:\W匹配任何非单词字符
    

      

    二、正则表达式语法

    1、表示单字符

    单字符:即表示一个单独的字符,比如匹配数字用\d ,匹配非数字使用\D,具体规则如下:

    字符

    功能

     

    .

    匹配任意1个字符(\n除外)

     

    [7a ]

    匹配[ ]中列举的字符,这里就是匹配7或者a这两个字符其中的一个

     

    \d

    匹配数字,即0-9

     

    \D

    匹配非数字,即不是数字

     

    \s

    匹配空白,即 空格,tab键

     

    \S

    匹配非空白

     

    \w

    匹配单词字符,即a-z、A-Z、0-9、_

     

    \W

    匹配非单词字符

     

    实例如下:

    # {m,n}表示n>m,匹配的位数
    # .:匹配任意1个字符(\n除外)
    print(re.search(r'.', s))  # <_sre.SRE_Match object; span=(0, 1), match='1'>
    #[7a]匹配[ ]中列举的字符,这里就是匹配7或者a这两个字符其中的一个
    print(re.search(r'[3a]', s))  # <_sre.SRE_Match object; span=(2, 3), match='3'>
    print(re.search(r'[3p]', s))  # <_sre.SRE_Match object; span=(2, 3), match='3'>
    print(re.search(r'[p3]', s))  # <_sre.SRE_Match object; span=(2, 3), match='3'>
    print(re.search(r'[p4]', s))  # <_sre.SRE_Match object; span=(5, 6), match='p'>
    

      

    import re
    
    s = '12356python123456python#'
    
    # \d匹配数字,即0-9
    print(re.search(r'\d', s))  # <_sre.SRE_Match object; span=(0, 1), match='1'>
    print(re.search(r'\d{3,}', s))  # <_sre.SRE_Match object; span=(0, 5), match='12356'>
    # \D匹配非数字,即不是数字
    print(re.search(r'\D', s))  # <_sre.SRE_Match object; span=(5, 6), match='p'>
    print(re.search(r'\D{3,}', s))  # <_sre.SRE_Match object; span=(5, 11), match='python'>
    
    # \w匹配单词字符,即a-z、A-Z、0-9、
    print(re.search(r'\w', s))  # <_sre.SRE_Match object; span=(0, 1), match='1'>
    # \W匹配非单词字符,即a-z、A-Z、0-9、
    print(re.search(r'\W', s))  # <_sre.SRE_Match object; span=(23, 24), match='#'>
    

      

    2、表示数量

    如果要匹配某个字符多次,就可以在字符后面加上数量进行表示,具体规则如下:

    字符

    功能

    *

    匹配前一个字符出现0次或者无限次,即可有可无

    +

    匹配前一个字符出现1次或者无限次,即至少有1次

    ?

    匹配前一个字符出现1次或者0次,即要么有1次,要么没有

    {m}

    匹配前一个字符出现m次

    {m,}

    匹配前一个字符至少出现m次

    {m,n}

    匹配前一个字符出现从m到n次

    import re
    
    s = '12356python123456python#'
    # *匹配前一个字符出现0次或者无限次,即可有可无
    print(re.findall(r'1*',s))  # ['1', '', '', '', '', '', '', '', '', '', '', '1', '', '', '', '', '', '', '', '', '', '', '', '', '']
    print(re.findall(r'T*',s))  # ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
    # +匹配前一个字符出现1次或者无限次,即至少有1次
    print(re.findall(r'1+', s))  # ['1', '1']
    print(re.findall(r'T+', s))  # []
    # ?匹配前一个字符出现1次或者0次,即要么有1次,要么没有
    print(re.findall(r'1?',s))  # ['1', '', '', '', '', '', '', '', '', '', '', '1', '', '', '', '', '', '', '', '', '', '', '', '', '']
    print(re.findall(r'T+?', s))  # []
    # {m}匹配前一个字符出现m次
    print(re.findall(r'1{1}', s))  # ['1', '1']
    # {m,}匹配前一个字符至少出现m次
    print(re.findall(r'1{2,}', s))  # []
    # {m,n}匹配前一个字符出现从m到n次
    print(re.findall(r'4{1,4}', s))  # ['1', '1']
    

      

    注意:
    *:匹配前面的子表达式零次或多次
    ‘*’特殊字符的作用是匹配*前面的子表达式零次或多次,这里面的子表达式指的是*前面的一个单元,例如ab*在这里*前面的子表达式指的就是b也就是说在匹配的时候在匹配到a之后,无论后面有没有b无论有几个b都能够匹配成功。
    print(re.findall("ab*","cabbbdaw3abw"))#['abbb', 'a', 'ab']
    
    ’+‘特殊字符的作用是匹配前面的子表达式一次或多次,同样这里的子表达式指的是+前面的一个单元,与*特殊字符不同的是+特殊字符前面的子表达式必须匹配到一次或多次才能算匹配成功,例如ab+在这个匹配式进行匹配时,当匹配到a的时候,如果a后面是一个或多个b就能匹配成功,如果不是则匹配失败。
    print(re.findall("ab+","cabbbdaw3abw"))#['abbb', 'ab']

    print(re.findall("ab?","cabbbdaw3abw"))#['ab', 'a', 'ab']
    
    

      

  • 相关阅读:
    设置MYSQL允许用IP访问
    EasyUI中那些不容易被发现的坑——EasyUI重复请求2次的问题
    Oracle初级性能优化总结
    Asp.Net MVC3.0网站统计登录认证的在线人数
    App.config和Web.config配置文件的配置节点的解析
    App.config和Web.config配置文件的自定义配置节点
    Asp.Net Web API 2第十八课——Working with Entity Relations in OData
    win7凭据管理、win7多用户远程登录、主机头设置、nuget.org无法访问
    Asp.Net Web API 2第十七课——Creating an OData Endpoint in ASP.NET Web API 2(OData终结点)
    C#基础知识系列八(const和readonly关键字)
  • 原文地址:https://www.cnblogs.com/mumianhuasayyes/p/15950748.html
Copyright © 2020-2023  润新知