• re模块


    import re
    1.findall
    import re
    ret=re.findall("d+","123456sdfasdgfd789")
    print(ret)
    结果:['123456', '789']
    
    
    参数 返回值类型:列表 返回值个数:2 返回值内容:所有匹配上的项
    import re
    ret=re.findall("s","123456sdfasdgfd789")
    print(ret)
    结果:[]

    2.search

    import re
    ret=re.search("d+","123456sdfasdgfd789")
    print(ret)
    结果:<re.Match object; span=(0, 6), match='123456'>
    返回值类型: 正则匹配结果的对象  返回值个数:1 如果匹配上了就返回对象
    import re
    ret=re.search("d+","123456sdfasdgfd789")
    print(ret.group())
    结果:123456
    返回的对象通过group来获取匹配到的第一个结果
    import re
    ret=re.search("s+","123456sdfasdgfd789")
    print(ret)
    结果:None
    返回值类型: None   如果没有匹配上就是None
    3.match
    import re
    ret=re.match("d+","123456sdfasdgfd789")
    print(ret)
    结果:<re.Match object; span=(0, 6), match='123456'>
    
    
    import re
    ret=re.match("d+","123456sdfasdgfd789")
    print(ret.group())
    结果:123456
    对比看,search和match的功能一样,但是也有不一样的时候
    import re
    ret=re.search("d+","#$%^&*123456sdfasdgfd789")
    print(ret)
    ret=re.match("d+","#$%^&*123456sdfasdgfd789")
    print(ret)
    结果:
    <re.Match object; span=(6, 12), match='123456'>
    None
    4.sub替换
    replace
    print("replace789,2afseeeefgeesfs".replace("e","HH"))
    结果:rHHplacHH789,2afsHHHHHHHHfgHHHHsfs
    
    print("replace789,2afseeeefgeesfs".replace("e","HH",3))
    结果:rHHplacHH789,2afsHHeeefgeesfs
    
    sub替换
    import re
    ret=re.sub("d+","HH","replace789,2afseeeefgeesfs")
    print(ret)
    结果:replaceHH,HHafseeeefgeesfs
    
    import re
    ret=re.sub("d+","HH","replace789,2afseeeefgeesfs",1)
    print(ret)
    结果:replaceHH,2afseeeefgeesfs
    
    

    5.subn

    import re
    ret=re.subn("d+","HH","replace789,2afseeeefgeesfs")
    print(ret)
    结果:('replaceHH,HHafseeeefgeesfs', 2)

    6.split

    import re
    ret=re.split("d+",'小明18小红25小李32')
    print(ret)
    结果:['小明', '小红', '小李', '']

    7.comple      #时间效率

    import re
    ret=re.compile("-?d+(.d*)")
    res=ret.search("54.2fvdsfas5633656-5213sf5")
    print(res)
    print(res.group())
    结果:
    <re.Match object; span=(0, 4), match='54.2'>
    54.2
    节省时间 : 只有在多次使用某一个相同的正则表达式的时候,这个compile才会帮助我们提高程序的效率

    8.finditer  #空间效率

    import re
    ret=re.finditer("d","asfsjgs552dfs df663adaf8sf")
    print(ret)
    for i in ret:
        print(i)
    结果:
    <re.Match object; span=(7, 8), match='5'>
    <re.Match object; span=(8, 9), match='5'>
    <re.Match object; span=(9, 10), match='2'>
    <re.Match object; span=(16, 17), match='6'>
    <re.Match object; span=(17, 18), match='6'>
    <re.Match object; span=(18, 19), match='3'>
    <re.Match object; span=(23, 24), match='8'>
        print(i.group())
    结果:
    5
    5
    2
    6
    6
    3
    8
    python中的正则表达式
    1 findall 会优先显示分组中的内容,要想取消分组优先,(?:正则表达式)
    2 split 遇到分组 会保留分组内被切掉的内容
    3 search 如果search中有分组的话,通过group(n)就能够拿到group中的匹配的内容

    分组----findall
    import re
    ret=re.findall("www.baidu.com|www.xinlang.com","www.xinlang.com")
    print(ret)
    结果:['www.xinlang.com']
    
    import re
    ret=re.findall("www.(baidu|xinlang).com","www.xinlang.com")
    print(ret)
    结果:['xinlang']
    
    import re
    ret=re.findall("www.(?:baidu|xinlang).com","www.xinlang.com")
    print(ret)
    结果:['www.xinlang.com']
    
    import re
    ret = re.findall('-0.d+|-[1-9]d*(.d+)?','-100aass-0.23ddxx-200')
    print(ret)
    结果:['', '', '']
    
    import re
    ret = re.findall('-0.d+|-[1-9]d*(?:.d+)?','-100aass-0.23ddxx-200')
    print(ret)
    结果:['-100', '-0.23', '-200']
    
    

    分组-----split

    import re
    ret=re.split("d+","小明12小红13小李14")
    print(ret)
    结果:['小明', '小红', '小李', '']
    
    import re
    ret=re.split("(d+)","小明12小红13小李14")
    print(ret)
    结果:['小明', '12', '小红', '13', '小李', '14', '']

    分组-----search

    import re
    ret=re.search("d+(.d+)(.d+)(.d+)?","1.2.3.4.5.6.7.899998885")
    print(ret.group())
    print(ret.group(0))
    print(ret.group(1))
    print(ret.group(2))
    print(ret.group(3))
    结果:
    1.2.3.4
    1.2.3.4
    .2
    .3
    .4

    分组练习

    1匹配所有的整数
    import re
    ret=re.findall(r"d+","1-2*(60+(-40.35/5)-(-4*3))")
    print(ret)
    结果:['1', '2', '60', '40', '35', '5', '4', '3']

    由结果知道40.35分隔开了
    import re
    ret=re.findall(r"d+(?:.d+)|(d+)","1-2*(60+(-40.35/5)-(-4*3))")
    ret.remove("")
    print(ret)
    结果:['1', '2', '60', '5', '4', '3']

    2从类似 <a>wahaha<a>匹配出wahaha 匹配出 a
    import re
    ret=re.findall(">(w+)<",r"<a>wahaha<a>")
    print(ret)
    结果:['wahaha']

    import re
    ret=re.findall("<(w+)>",r'<a>wahaha<a>')
    print(ret)
    结果:['a']

    import re
    ret=re.search(r"<(w+)>(w+)</(w+)>",r"<a>wahaha</b>")
    print(ret.group())
    print(ret.group(1))
    print(ret.group(2))
    print(ret.group(3))
    结果:
    <a>wahaha</b>
    a
    wahaha
    b
    正则表达式进阶
    1 分组命名
    (?P<name>正则表达式) 表示给分组起名字
    (?P=name)表示使用这个分组,这里匹配到的内容应该和分组中的内容完全相同
    2 通过索引使用分组
    1 表示使用第一组,匹配到的内容必须和第一个组中的内容完全相同
    import re
    ret=re.search("<(?P<name>w+)>w+</(?P=name)>","<a>wahaha</a>")
    print(ret.group())
    print(ret.group("name"))
    结果:
    <a>wahaha</a>
    a
    
    import re
    ret = re.search(r'<(w+)>w+</1>',r"<a>wahaha</a>")
    print(ret.group(1))
    print(ret.group())
    结果:
    a
    <a>wahaha</a>
    
    import re
    ret=re.search(r"<(?P<asd>w+)>(?P<zxc>w+)</w+>",r"<a>wahaha</a>")
    print(ret.group("asd"))
    print(ret.group("zxc"))
    结果:
    a
    wahaha
    爬虫
    import re
    from urllib.request import urlopen
    # 内置的包 来获取网页的源代码 字符串
    # res = urlopen('http://www.cnblogs.com/Eva-J/articles/7228075.html')
    # print(res.read().decode('utf-8'))

    def getPage(url):
    response = urlopen(url)
    return response.read().decode('utf-8')

    def parsePage(s): # s 网页源码
    ret = com.finditer(s)
    for i in ret:
    ret = {
    "id": i.group("id"),
    "title": i.group("title"),
    "rating_num": i.group("rating_num"),
    "comment_num": i.group("comment_num")
    }
    yield ret

    def main(num):
    url = 'https://movie.douban.com/top250?start=%s&filter=' % num # 0
    response_html = getPage(url) # response_html是这个网页的源码 str
    ret = parsePage(response_html) # 生成器
    print(ret)
    f = open("move_info7", "a", encoding="utf8")
    for obj in ret:
    print(obj)
    data = str(obj)
    f.write(data + " ")
    f.close()

    com = re.compile(
    '<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>d+).*?<span class="title">(?P<title>.*?)</span>'
    '.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S)
    count = 0
    for i in range(10):
    main(count) # count = 0
    count += 25
    # flags有很多可选值:
    # 
    # re.I(IGNORECASE)忽略大小写,括号内是完整的写法
    # re.M(MULTILINE)多行模式,改变^和$的行为
    # re.S(DOTALL)点可以匹配任意字符,包括换行符
    # re.L(LOCALE)做本地化识别的匹配,表示特殊字符集 w, W, , B, s, S 依赖于当前环境,不推荐使用
    # re.U(UNICODE) 使用w W s S d D使用取决于unicode定义的字符属性。在python3中默认使用该flag
    # re.X(VERBOSE)冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释
     
     
     









  • 相关阅读:
    20191211 HNOI2017 模拟赛 问题A
    20191211 HNOI2017模拟赛 C题
    BZOJ 3681 Arietta
    netcore3.1中的Json操作
    netcore2.2出现的新特性HealthCheck
    MVC为什么要使用TagHelper?
    psql备份csv文件
    DataAnnotations的使用及细节处理
    记录一次mac安装node遇到的错误
    记录一次netcore3.0 code first使用迁移命令报错问题
  • 原文地址:https://www.cnblogs.com/chenyibai/p/9438041.html
Copyright © 2020-2023  润新知