• re模块与正则表达式


    1.re模块与正则表达式之间的关系

      正则表达式不少python独有的,它是一门独立的技术。所有的编程语言都可以使用正则表达式,但是如果你想在python中使用,你就必须依赖于re模块。

    2.字符

    字符:

    元字符

    匹配内容

    .

    匹配除换行符以外的任意字符

    w

    匹配字母或数字或下划线

    W

    匹配非字母或数字或下划线

    s

    匹配任意的空白符

    S

    匹配非空白符

    d

    匹配数字

    D

    匹配非数字

    匹配一个换行符

    匹配一个制表符

    

    匹配一个单词的结尾

    ^

    匹配字符串的开始  (类似于startswith

    $

    匹配字符串的结尾  (类似于endswith

    ^$连用,会精确限制匹配的内容,两者中间写什么,就是什么字符

    a|b

    匹配字符a或字符b(把长的写在前面)

    ()

    匹配括号内的表达式,也表示一个组

    […]

    匹配字符组中的字符

    [^…]

    匹配除了字符组中字符的所有字符(取反)

    3.量词

      (1)量词必须跟在正则符号的后面

      (2)量词只能够限制住紧挨着它的那一个正则符号

      正则表达式在匹配的时候默认为贪婪模式(即尽量匹配多的),可以通过在量词后面加一个? ,就可以将贪婪匹配变成非贪婪匹配(即惰性匹配)。

    量词:

    量词

    用法说明

    *

    重复零次或更多次

    +

    重复一次或更多次

    重复零次或一次

    {n}

    重复n

    {n,}

    重复n次或更多次

    {n,m}

    重复nm

    (.*?)的用法

    # .    是任意字符
    # *   是取0至无线长度
    # ?  是非贪婪模式
    # 组合在一起就是指:取尽量少的任意字符,一般用于:.*?x
    #    意思是取前面任意长度的字符,直到一个x出现

    4.re模块下的常用方法

    import re
    ret = re.findall('a','apple,age,add')#返回所有满足匹配条件的结果,放在列表里
    print(ret)
    #>>>:['a', 'a', 'a']
    # 函数会在字符串内通过查找模式匹配,直到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
    
    ret = re.match('a','apple,age,add').group()  # 同search,不过尽在字符串开始处进行匹配
    print(ret)
    #>>>:a
    
    ret = re.split('[ab]','acbcd') # 先按'a'分割得到''和'cbcd',在对''和'cbcd'分别按'b'分割
    print(ret)
    >>>:['', 'c', 'cd']
    
    ret = re.sub('d','H','ead5fkaj3fas6h',2)#将数字替换成'H',参数2表示只替换2个数字
    print(ret)
    >>>:eadHfkajHfas6h
    
    ret = re.subn('d', 'H', 'eva3e2gon4yua2n4')#将数字替换成'H',返回元组(替换的结果,替换的次数)
    print(ret)
    >>>:('('evaHeHgonHyuaHnH', 5)
    
    obj = re.compile('d{3}')#将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个l连续的数字
    ret = obj.search('abcd1234ajf')#正则表达式对象调用search,参数为待匹配的字符串
    print(ret.group())
    >>>:123

    (1).findall的优先级

    import re
    ret= re.findall('www.(baidu|kugou).com','www.kugou.com')
    print(ret)#findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
    >>>:['kugou']
    
    ret= re.findall('www.(?:baidu|kugou).com','www.kugou.com')
    print(ret)#findall
    >>>:['www.kugou.com']

    (2)split的优先级查询

    import re
    ret = re.split('d+','abcd12e34f'print(ret)
    >>>:['abcd', 'e', 'f']
    
    ret = re.split('(d+)','abcd12e34f'print(ret)
    >>>:['abcd', '12', 'e', '34', 'f']
    # 在匹配部分加上()之后所切出的结果是不同的,没有()的就没有保留所匹配的项,
    # 但是有括号的却能够保留了匹配的项,这个在某些需要保留匹配部分的使用过程是非常重要的。

    (3) search与match的异同点

    import re
    ret = re.search('a','pplae age hard')
    print(ret)# search不会给你直接返回匹配到的结果,而是给你返回一个对象
    >>>:<_sre.SRE_Match object; span=(3, 4), match='a'>
    print(ret.group())# 必须调用group才能看到匹配的结果
    >>>:a
    #注意:1.search只会依据正则查找一次,只要查到了结果,就不会再往后查找
          2.当查找的结果不存在的情况下,调用group直接报错
    import re
    ret = re.match('a','pplae age hard')
    print(ret)
    print(ret.group())
    >>>:None
    # 注意:1.match只会匹配字符串的开头部分。
           2.当字符串的开头不符合匹配规则的情况下,返回的也是None,此时如果再调用group也会报错。
  • 相关阅读:
    URL中编码问题
    java得到当前时间
    java 集合类详解
    java String 详解
    java context 讲解
    java代码优化
    oracle 面试题
    查找算法总结
    10个经典的排序算法
    时间复杂度,相关排序算法时间复杂度的比较
  • 原文地址:https://www.cnblogs.com/blue-tea/p/11202438.html
Copyright © 2020-2023  润新知