zoukankan      html  css  js  c++  java
  • python re 模块

    import   re 

    1.常用方法:

    findall   ⭐

    import re
    ret = re.findall("d+","s1da48e5d1fw8e4f") #第一个参数为正则,第二个参数为待匹配字符串
    print(ret)  #返回值:列表格式返回一个值,内容为所有匹配上的项

    search  

    import re
    ret = re.search("d+","s1da48e5d1fw8e4f") #返回值类型为正则匹配结果的对象,返回一个值,
    print(ret)  #匹配上就返回对象
    print(ret.group()) #返回的对象通过group()来获取匹配到的第一个结果

    match  

    import re 
    ret = re.match('d+','19874ashfk01248')
    print(ret)
    #结果 <_sre.SRE_Match object; span=(0, 5), match='19874'>
    #match方法在正则匹配之前一藏了一个^("^d+"),所以总是默认从第一位开始匹配,第一位匹配不上就是None ret1
    = re.match('d+','%^19874ashfk01248') print(ret1)
    #结果 None

    替换(相当于replace)

    sub  

    import re
    print("a1s2ad3fa3g".replace("a","A",3))
    ret =re.sub("d+","A","a1s2ad3fa3g") #把数字都替换成大写的 A
    print(ret)
    #结果 A1s2Ad3fA3g
    ret1 =re.sub("d+","A","a12s23ad43fa35g",1) #最后一个参数表示替换几次,1就是只替换第一个
    print(ret1)
    # 结果 aAs23ad34fa35g

    subn  

    import re 
    ret = re.subn('d+','H','replace789nbc2xcz392zx')
    print(ret)   #返回值为元组,第一个为匹配后结果,第二个参数为替换的次数
    #结果 #('replaceHnbcHxczHzx', 3)

    split  

    import re
    ret = re.split("d+","a10b20c30d40")
    print(ret)
    #结果  ['a', 'b', 'c', 'd', '']

    2.进阶方法 - 爬虫自动化开发

    compile  ⭐  (时间效率)

    import re
    ret = re.compile("-0.d+|-[1-9]d+(.d+)?")
    #利用compile方法提前准备好一个匹配规则
    obj = ret.search("alex83egon-20taibai-40")
    #需要的时候直接调用,ret.方法,里面参数传待匹配字符串
    print(obj.group())

    此方法节省时间,只有在多次使用某一个相同规则表达式的时候,compile才会帮助我们提高效率

    finditer   ⭐ (空间效率)

    import re
    ret = re.finditer("d+","df154dsfwe8f4d5x21wfe4")
    print(ret)
    #结果 <callable_iterator object at 0x000001CAFFB4C080>
    #拿到一个迭代器
    for i in ret :
        print(i.group())
    #循环拿出每一个元素

    findall是一次把所有匹配的元素全部拿出来,如果是很大的文件会很占内存,这是利用finditer,需要一个拿一个,节省内存空间

    匹配的优先级  ⭐

    1. findall()优先级

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

    2.split()优先级

    ret=re.split("d+","eva3egon4yuan")
    print(ret) #结果 : ['eva', 'egon', 'yuan']
    
    ret=re.split("(d+)","eva3egon4yuan")
    print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan']
    
    #在匹配部分加上()之后所切出的结果是不同的,
    #没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
    #这个在某些需要保留匹配部分的使用过程是非常重要的。

    3.search()

    import re
    ret = re.search('d+(.d+)(.d+)(.d+)?','1.2.3.4-2*(60+(-40.35/5)-(-4*3))')
    print(ret.group())
    print(ret.group(1))
    print(ret.group(2))
    print(ret.group(3))

    分组命名

    (?P<name>)==>(?P=name)

    <w+>w+</1>

    import re
    
    
    ret = re.search("<(?P<tag_name>w+)>w+</(?P=tag_name)>","<h1>hello</h1>")
    #还可以在分组中利用?<name>的形式给分组起名字
    #获取的匹配结果可以直接用group('名字')拿到对应的值
    print(ret.group('tag_name'))  #结果 :h1
    print(ret.group())  #结果 :<h1>hello</h1>
    
    ret = re.search(r"<(w+)>w+</1>","<h1>hello</h1>")
    #如果不给组起名字,也可以用序号来找到对应的组,表示要找的内容和前面的组内容一致
    #获取的匹配结果可以直接用group(序号)拿到对应的值
    print(ret.group(1))
    print(ret.group())  #结果 :<h1>hello</h1>
     
  • 相关阅读:
    由 container 一词所想到的
    突然间,firebug中不显示用console.log打印的信息了
    学习计划表-快照-2017.2.16
    学习编程让我成功减肥!
    什么是编程?
    计算两个事件之间的时间差
    使用substring和split方法从字符串中抽取一组清单
    js中十进制数转换为16进制
    Definition of success-成功的定义
    如何让老式浏览器支持html5新增的语义元素
  • 原文地址:https://www.cnblogs.com/beihan/p/9439238.html
Copyright © 2011-2022 走看看