zoukankan      html  css  js  c++  java
  • Python正则re模块

     常用方法

    编译

    re.compile(pattern,flags=0)->regex #将正则表达式模式编译成正则表达式对象。

    • pattern #需要编译的正则表达式
    • flags #正则表达式使用的模式。re.S|re.M 开启多行模式和单行模式
    1. 常用模式有:re.I,re.M,re.S,re.X
      为了提高效率,正则表达式可以被编译,这些编译后的结果被保存,下次使用同样的pattern的时候,就不需要再次编译。
      编译后的对象同样可以使用match(),search()方法进行匹配。

    单次匹配

    • re.match(pattern,string,flags=0)->match #匹配从字符串的开头匹配,返回match对象
    • regex.match(string[,pos[,endpos]])->match #regex对象match方法可以重设定开始位置和结束位置。返回match对象
      • pattern #正则表达式
      • string #需要匹配的字符串
      • flags #正则表达式使用的模式
        • 常用模式有:re.I,re.M,re.S,re.X
      • pos #匹配字符串的开始位置,默认从0索引位置开始匹配
      • endpos #匹配字符串的结束位置(不包含结束位置),默认值为len(string)
    • 注意:
    1. match会从字符串的开头开始查找,即使在re.M(多行模式)中。^符号也只表示字符串的开头,$符号也只表示字符串的结尾。即:多行模式re.M对match无效
    2. match只会从字符串的开始位置(开始位置可以是字符串的开头,也可以用pos指定)与正则表达式的第一个字符开始匹配。
    3. regex.match中指定开始位置和结束位置后启用多行模式,对^和$符号无影响,依然是指原字符串的开头和结尾
    4. re.match,re.search,re.fullmatch三个匹配方法中只有re.match忽略多行模式的影响。

    示例:

    import re
    str1 = """123
    456"""
    print(re.match("^d*",str1,re.M))
    print(re.match("^d*",str1))
    print(re.match("^[d
    ]*",str1,re.M))
    
    regex = re.compile("^d*")
    print(regex.match(str1))
    #注意regex可以重新指定字符串的开始位置,和结束位置(不包含结束位置)
    print(regex.match(str1,0,2))
    #注意:regex中开始位置和结束位置对^和$符号无影响,依然是指原字符串的开头和结尾
    print(regex.match(str1,3))  #返回值为None,因为截开始的位置不是字符串的开头。所以无法匹配

    search

    • re.fullmatch(pattern,string,flags=0)->match #(整个字符串和正则表达式匹配)起始位置和结束位置的字符串和整个正则表达式匹配
    • regex.fullmatch(string[,pos[,endpos]])->match #(整个字符串和正则表达式匹配)起始位置和结束位置的字符串和整个正则表达式匹配
      • pattern #正则表达式
      • string #需要匹配的字符串
      • flags #模式
      • pos #匹配的起始位置
      • endpos #匹配的结束位置(不包含结束位置)
    import re
    str2 = """abc abc bcd eff aaa
    bc bcd"""
    print(re.fullmatch("bcd",str2)) #fullmatch起始位置和结束位置的字符串和整个正则表达式匹配
    print(re.fullmatch("a[w 
    ]*",str2)) 
    print(re.fullmatch("b[w 
    ]*",str2,re.M))
    print(re.compile("b[w 
    ]*").fullmatch(str2,20)) #改变起始位置匹配
    print(re.compile("^b[w 
    ]*").fullmatch(str2,20)) #因为是单行模式,所有^只表示字符串的开始位置
    print(re.compile("^b[w 
    ]*",re.M).fullmatch(str2,20)) #可以识别多行模式

    全文搜素(findall)

    • re.findall(pattern,string,flags=0)->list #对整个字符串从左至右匹配,返回所有匹配项的列表
    • regex.findall(string[,pos[,endpos]])->list #对整个字符串从左至右匹配,返回所有匹配项的列表
      • pattern #正则表达式
      • tring #需要匹配的字符
      • flags #模式
      • pos #匹配的起始位置
      • endpos #匹配的结束位置(不包含结束位置)
    import re
    str1 = """abc abcd def
    dbc abc"""
    print(re.findall("w+",str1))
    repex = re.compile("w+")
    print(repex.findall(str1))
    print(repex.findall(str1,5))
    print("-------------")
    print(re.findall("^w+",str1))
    print(re.findall("^w+",str1,re.M))
    • re.finditer(pattern,string,flags=0)->iterable #对整个字符串从左至右匹配,返回所有匹配选项,返回迭代器
    • regex.finditer(string[,pos[,endpos]])->iterable ##对整个字符串从左至右匹配,返回所有匹配选项,返回迭代器
    • 注意:每次迭代返回的都是match对象
    import re
    str1 = """abc abcd def
    dbc abc"""
    reiter = re.finditer("w+",str1)
    print(type(reiter),reiter)
    a = next(reiter)
    print(type(i),i)
    for i in reiter:
        print(i.start(),i.end(),i.span(),i.group(0))
        print(i)

    匹配替换

    • re.sub(pattern,replacement,string,count=0,flags=0)->new_string #将匹配到的字符替换成指定字符
    • regex.sub(replacement,string,count=0)->new_string #将匹配到的字符替换成指定字符
    • re.subn(pattern,replacement,string,count=0,flags=0)->(new_string,number_of_subs_made) #将匹配到的字符替换成指定字符
    • regex.subn(replacement,string,count=0)->(new_string,number_of_subs_made) #将匹配到的字符替换成指定字符
    import re
    str1 = "a23asldkf234xdd"
    print(re.sub("d","",str1))
    print(re.subn("d","",str1))
    print(re.sub("d","",str1,2))
    req = re.compile("d")
    print(req.sub("",str1,3))
    print(req.subn("",str1))

    分割

    • re.split(pattern,string,maxsplit=0,flags=0)->list
    • regex.split(string,maxsplit=0)->list
    import re
    str1 = "a1dslkd3ksdk245ks5jdf"
    print(re.split("d",str1))
    print(re.split("d",str1,2))
    print("----------")
    rep  = re.compile("d")
    print(rep.split(str1))
    print(rep.split(str1,1))
    print("---------------")
    print(re.split("k(s)",str1))

    Match.group([group1,…]) #获取指定组的元素,如果指定多个组,返回一个元组

    • group1 #组的id或者名称
    >>> m = re.match(r"(d+).(?P<name>d+)","24.356")
    >>> m.group(1),m.group("name"),m.group(1,"name")
    ('24', '356', ('24', '356'))
  • 相关阅读:
    项目配置64位Release版,编译提示:TRACKER : 错误 TRK0005: 未能找到: “CL.exe”。系统找不到指定的文件。
    解决word表格中换行到最后一行不分页以及分页后在最后一行回车后增加一个新页页不是与其它内容共用一页
    Qt error: undefined reference to `vtable for XXX'
    C++中string转int
    U盘在linux下出现加锁解决办法
    Qt执行没崩溃,但是也不往下走,一调式出现Signal Received错误
    工具里调整视图切换新结构后调用表格的importfile会崩溃
    treectrl关联了一个右键弹出菜单,但是一执行到GetSubMenu(0)就崩溃
    java中lock和synchronized区别
    http 状态码
  • 原文地址:https://www.cnblogs.com/fjjj/p/12925464.html
Copyright © 2011-2022 走看看