• python学习——re模块


    re模块

    • findall***** 返回列表,找所有的匹配结果
      • 语法:findall('正则表达式','待匹配字符串',flag)
    • search***** 返回一个内存地址,这是一个正则匹配的结果span是索引,match是匹配结果,通过group取值;没有对应匹配结果就返回None,group会报错
      • 语法:search(‘正则表达式’,‘待匹配字符串’)
      • ret = re.search('d+','fdaf1123afda23')
      • if ret: # 内存地址,这是一个正则匹配的结果
        • print(ret.group())# 通过ret.group()获得真正的记过
    • match** 相当于search的正则表达式汇总加了一个^,只能从头开始匹配
      • ret = re.match('d+$','128fdasfd')
      • print(ret)
    • split** 返回列表,按照正则规则切割,默认去、匹配到的内容会被切掉
      • ret = re.split('d+',s)
      • print(ret)
    • sub/subn** 替换,按照正则规则去寻找要被替掉的内容,subn返回元组,第二个值是替换的次数
    • compile***** 编一个正则表达式,用这个结果去search、match、findall、finditer,能够节省时间
      • ret = re.compile('正则') # 已经完成编译
      • ret.findall('待匹配字符串')
    • finditer***** 返回一个迭代器,所有的结果都在这个迭代器中,需要通过循环+group的形式取值,能够节省内存

        ret = re.finditer('正则',’带匹配str‘)

        for i in ret:

          print(i.group())

    findall:匹配所有每一项都是列表中的一个元素

    1 import re
    2 ret = re.findall('d+','qgadgeafd798a') #正则表达式,带匹配的字符串,flag
    3 ret1 = re.findall('d','qgadgeafd798a')
    4 print(ret)
    5 print(ret1)

    search:只匹配从左到右的第一个,得到的不是直接的结果,而是一个变量,通过这个变量的group方法获取结果,如果没有匹配到会返回None,使用group会报错

    import re
    ret = re.search('d+','qgadgeafd798a') if ret: print(ret) #返回内存地址,这是一个正则匹配的结果 print(ret.group()) #通过ret。group()获取真正的结果



    math 从头开始匹配,相当于search中的正则表达式加上^

    ret = re.match('d+','qgadgeafd798a')
    print(ret)


    字符串处理的扩展:替换 切割
    split 按照正则表达式的内容切割

    s = 'alex83taibai40egon25'
    ret = re.split('d+',s)
    print(ret)


    sub 替换 谁 旧的 新的 替换次数

    ret = re.sub('d+','H','alex83taibai40egon25')
    print(ret)


     subn 返回一个元组第二个元素是替换次数

    ret = re.subn('d+','H','alex83taibai40egon25')
    print(ret)

    re模块的进阶
      compile 节省你是用正则表达式解决问题的时间,编译 将正则表达式编译成字节码,在多次使用过程中,不会多次编译

    ret = re.compile('d+')
    print(ret)
    res = ret.findall('alex83taibai40egon25')
    print(res)
    ress = ret.search('alex83taibai40egon25')
    print(ress.group())

      finditer 节省你是用正则表达式解决问题的空间

    ret = re.finditer('d+','alex83taibai40egon25')
    print(ret)
    for i in ret:
    print(i.group())
    import re
    s = '<a>wahaha</a>' #   标签语言html
    ret = re.search('<(w+)>(w+)</(w+)>',s)
    print(ret.group())#所有结果
    print(ret.group(0))#所有结果
    print(ret.group(1))#数字参数代表的是去对应分组中的内容
    print(ret.group(2))
    print(ret.group(3))

    为了findall也可以顺利娶到分组中的内容,有一个特殊语法,就是优先显示分组中的内容
    ret = re.findall('w+',s)
    print(ret)
    ret = re.findall('>(w+)<',s)
    print(ret)

    取消分组优先(?:正则表达式)
    ret = re.findall('d+(.d+)?','1.234*')
    print(ret)

    关于分组
    对于正则表达式来说,有些时候我们需要进行分组,来整体约束某一组字符出现的次数  
    (.[w]+)?

    对于python语言来说,分组可以帮助你更好更精准的找到你真正需要的内容
    <(w+)>w(w+)</(w+)>

    split 添加分组()保留被切掉的正则表达式
    ret = re.split('d+','alex83taibai40egon25')
    print(ret)
    ret = re.split('(d+)','alex83taibai40egon25')
    print(ret)


    python和正则表达式之间的特殊约定

    分组命名 (?P<这个组的名字>这则表达式)
    s = '<a>wahaha</a>'
    ret = re.search('>(?P<con>w+)<',s)
    print(ret.group(1))
    print(ret.group('con'))

    s = '<a>wahaha</b>'
    pattern = '<(?P<tab>w+)>(w+)</(?P=tab)>'
    ret = re.search(pattern,s)
    print(ret)
    你要匹配的内容太美有特点了,容易和你不想匹配的内容混在一起,精准的取到整数,过滤掉小数

    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']
    ret=re.findall(r"-?d+.d*|(-?d+)","1-2*(60+(-40.35/5)-(-4*3))")
    print(ret) #['1', '-2', '60', '', '5', '-4', '3']
    ret.remove("")
    print(ret) #['1', '-2', '60', '5', '-4', '3']

    正则表达式如果写的足够好,能够最大限度的简化我们的操作

    正则表达式到底重要到什么程度
    掌握作业中的所有内容
    能够看懂常用的正则表达式
    并且能够做出一些公司特异性要求的修改

    简单了解爬虫实例
    import re
    import json
    from urllib.request import urlopen
    
    def getPage(url):
        response = urlopen(url)
        return response.read().decode('utf-8')
    
    def parsePage(s):
        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)
    
        ret = com.finditer(s)
        for i in ret:
            yield {
                "id": i.group("id"),
                "title": i.group("title"),
                "rating_num": i.group("rating_num"),
                "comment_num": i.group("comment_num"),
            }
    
    def main(num):
        url = 'https://movie.douban.com/top250?start=%s&filter=' % num
        response_html = getPage(url)
        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 + "
    ")
    
    count = 0
    for i in range(10):
        main(count)
        count += 25
  • 相关阅读:
    (没有意义讨论)二元运算符和自加符的深入理解,小心多个++的陷阱
    c语言复杂变量声明(数组、指针、函数)
    bundle对象传送序列化serialization引用时问题
    android异步任务详解 AsynTask
    servlet使用get方法传送中文参数
    服务器2
    windows server 2003 网站无法访问,重启iis也不行。重启系统解决了。
    得到本周第一天
    JS时间大全
    树状侧边栏
  • 原文地址:https://www.cnblogs.com/bilx/p/11348969.html
Copyright © 2020-2023  润新知