• Python 学习之路


    正则表达式

    正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。

    re 模块用于正则表达式的操作。

    一、 用于匹配的函数

    1. findall(pattern,string,flags=0)

    匹配字符串中所有符合条件的元素。匹配上,返回list类型元素

    import re
    
    obj = re.findall('d+','hhh90080mmmbb2233pp')
    print(obj)

    2. match(pattern,string,flags=0)

    从字符串起始位置匹配符合条件的元素,单个匹配。匹配上,返回一个对象

    注意:字符串起始位置的元素必须与正则表达式相匹配,不然返回None

    import re
    
    obj = re.match('d+','0008lkk')
    print(obj,type(obj))
    if obj:
        print(obj.group())

    3. search(pattern,string,flags=0)

    在字符串中寻找匹配的元素,单个匹配。匹配上,返回一个对象

    import re
    
    obj = re.search('d+','hhh90080mmmbb2233pp')
    if obj:
        print(obj.group())

    4. group()和groups()

    分组是用()进行的,一个正则表达式可以用括号进行分组

    group()获得一个,多个分组截获的字符串;或所有分组匹配的整体字符串

    groups()以元组形式返回全部分组截获的字符串

    import re
    
    a = "123abc456ooo"
    
    print( re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(0))   #编号0代表整个匹配的子串;不填写参数时,相当于group(0)
    print( re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(1,2)) #指定多个参数时将以元组形式返回 ('123', 'abc')
    print(re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(2))    #指定一个参数时返回字符串 abc
    
    print (re.search("([0-9]*)([a-z]*)([0-9]*)", a).groups())   #('123', 'abc', '456')

    5. sub(pattern, repl, string, count=0, flags=0)

    替换与正则表达式相匹配的字符串

    import re
    
    s = "hello world 001,789 welcome"
    s_c = re.sub('d+','amy',s,1) #只替换一次,不填count会全部替换
    print(s_c)

    比str.replace()更加强大。

    6. split(pattern,string,maxsplit=0,flag=0)

    根据指定的正则匹配进行分割。

    注意:最后一个字符匹配成功的话,会分割出一个空格

    import re
    
    n = "split1nnnnn2mmmmm3"
    n_c = re.split('[0-9]',n,1) #最多分割一次,不填maxsplit会全部分割
    print(n_c)

    7. compile(strPattern[, flag])

    将字符串形式的正则表达式编译为一个对象。

    import re
    
    text = "You are so cool, oo"
    pattern = re.compile(r'w*oow*') #将正则表达式编译成Pattern对象
    print(pattern.findall(text)) #查找所有包含oo的单词,使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None

    二、匹配的语法

    语法 说明 表达式实例 匹配的字符串
    字符
    一般字符 匹配自身 abc abc
    .

    匹配任意字符(除换行符)

    若指定flag DOTALL,则匹配任意字符,包括换行 

    a.c akc
    转义字符,使其后的字符变成字面上的字符 a.c a.c
    [...] 字符集,[a*]匹配字符是a 或 *;’[a-z]匹配a到z之间的任意字符;
    [^f]匹配非 f 的任意字符;[d]匹配数字.
    字符集中除了 - ^ 外,其他特殊字符没有特殊含义
    [a*]k

    aK

    *k

    数量(用在字符或(...)之后)
    * 匹配前一个字符0或无限次    
    + 匹配前一个字符1或无限次    
    ? 匹配前一个字符0次或1次    
    {m} 匹配前一个字符m次    
    {m,n} 匹配前一个字符m到n次,省略m,0到n;省略n,m到无限    
    预定义字符(可以写在[]字符集中)
    d 数字:[0-9]    
    D 非数字:[^d]    
    w 字母数字下划线:[A-Za-z0-9_]    
    W [^W]    
    边界匹配      
    ^ 匹配字符串开头 ^abc abc

    $ 

    匹配字符串结尾 abc$

    abc

    A        

    仅仅匹配字符串开头                                                    

    Aa         abc
     仅仅匹配字符串结尾 c abc
     匹配w和W之间;单词的开始或结束 a!bc a!bc
    B [^] aBbc abc
    逻辑,分组
    | |代表左右表达式任意匹配一个。从左
    往右匹配,左边的匹配成功便跳过右边
    abc|def abc
    def
    (...) 被括起来的表达式将作为分组;分组表
    达式作为一个整体,后面可以接数量。表达式
    中的 | 只在该组中有效。

    从表达式的左边开始没遇到一个分组的左括号,
    编号就加1
    (abc){2}

    a(123|456)c
    abcabc

    a456c

    三、flag

    # flags
    I = IGNORECASE = sre_compile.SRE_FLAG_IGNORECASE # ignore case
    L = LOCALE = sre_compile.SRE_FLAG_LOCALE # assume current 8-bit locale
    U = UNICODE = sre_compile.SRE_FLAG_UNICODE # assume unicode locale
    M = MULTILINE = sre_compile.SRE_FLAG_MULTILINE # make anchors look for newline
    S = DOTALL = sre_compile.SRE_FLAG_DOTALL # make dot match newline
    X = VERBOSE = sre_compile.SRE_FLAG_VERBOSE # ignore whitespace and comments

    四、r 原生字符

    正则表达式里使用""作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\"表示。同样,匹配一个数字的"\d"可以写成r"d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。

    学习内容来自:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

  • 相关阅读:
    【新】idea激活码,jetbrains全系列最新2020激活码和破解补丁(亲测可用),可免费使用69年
    分享【高热度网】最火热的10篇文章,每一篇都是精品
    什么是高热度网(gaoredu.com)?高热度网站都有哪些功能?
    【高热度网】2020年最新8款迷你世界手机黑科技辅助软件免费下载
    【我爱科技论坛】关于我爱科技论坛解压密码的说明
    《前端工程师面试宝典》---前端面试必备
    【VIP视频网站项目】VIP视频网站项目v1.0.3版本发布啦(程序一键安装+电影后台自动抓取+代码结构调整)
    【数据结构】队列实现的5种方式及时间复杂度对比分析
    解决Webpack中提示syntax 'classProperties' isn't currently enabled的错误
    如何配置静态MAC地址
  • 原文地址:https://www.cnblogs.com/peiling-wu/p/6413602.html
Copyright © 2020-2023  润新知