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

    1、re模块的基础方法

      1.1查找

        findall:返回列表 找到所有的匹配项

        search:匹配成功就返回一个变量,通过group取匹配到的第一个值,不匹配就返回None,group报错

    1 ret2 = re.search('d+','asd123sdf43asd23')
    2 print(ret2)  # 打印的是内存地址,这是一个正则匹配的结果
    3 print(ret2.group())  #通过ret.group()来获取真正的结果

        match:相当鱼search的正则表达式中加了一个'^',其余没有区别

      1.2切割和替换

        split:返回列表,按照正则规则去切割,默认匹配到的内容会被切割

    1 s = 'john23faker27chuang50'
    2 ret3 = re.split('d+',s)
    3 print(ret3)
    4 
    5 #打印结果为:['john', 'faker', 'chuang', '']

        sub/subn:替换,按照正则规则去寻找要被替换掉的内容,subn返回元祖,第二个值是替换的次数

    # sub替换 (正则,替换的结果,需要替换的内容,替换的次数)
    ret4 = re.sub('d+', 'H', 'john23faker27chuang50', 1)
    print(ret4)
    
    打印结果为:johnHfaker27chuang50

      1.3编译和迭代器

        compile:编译一个正则表达式,用这个结果去search math findall finditer 能够节省时间

        finditer:返回一个迭代器,所有的结果都在这个迭代器中,需要通过循环+group的形式取值,能够节省内存

    2、关于分组在re模块中的使用

      2.1关于分组优先在findall中的用法:---(w+)

    1 #python正则默认分组优先:(这个和正则本身无关)
    2 s = '<a>wahaha</a>'
    3 ret = re.findall('>(w+)<',s)
    4 print(ret)   # 预期:>wahaha<   实际:wahaha  就是分组优先
    5 ret2 = re.findall('>(?:w+)<',s)  #组内最前面加上?:表示取消分组优先
    6 print(ret2)   # 正常打印

      2.2关于分组优先在split中的用法:

    # split
    ret3 = re.split('d+','john23faker27chuang50')  # 切割的内容不会保留
    ret4 = re.split('(d+)','john23faker27chuang50')  # 切割的内容会保留
    print(ret3)
    print(ret4)

      2.3分组命名

    # 分组命名,使用前面的分组 要求使用这个名字的分组和掐面同名分组中的内容匹配的必须一致。(用python也可以直接实现)
    s = '<a>wahaha</a>'
    pattern = '<(?P<tab>w+)>(w+)</(?P=tab)>'
    ret = re.search(pattern, s)
    print(ret)

      上述代码,如果将a标签的结束标签改变一下,则会返回None。

      2.4.分组在re模块中的方法之search:

    1 import re
    2 s = '<a>wahaha</a>'
    3 ret = re.search('<(w+)>(w+)</(w+)>',s)
    4 print(ret.group())  # 所有的结果
    5 print(ret.group(1))
    6 print(ret.group(2))
    7 print(ret.group(3))

      这是最基础的通过.group(index)来取分组中的内容

      如果给分组起名字的话,也可以直接通过.group(name)来取分组中的内容( 正则(?P<name>正则)      使用这个分组 ?P=name)

    3、用正则写的一个简易爬虫demo

      纯正则提取,函数写。

      

     1 # coding:utf-8
     2 import re
     3 from urllib.request import urlopen
     4 
     5 
     6 def getPage(url):  # 获取整个html的字符串
     7     response = urlopen(url)
     8     return response.read().decode('utf-8')
     9 
    10 
    11 def parsePage(s):
    12     ret = com.finditer(s)  # 从这个html中,找到所有符合com正则表达式规则的内容并且以迭代器的形式返回
    13     for i in ret:
    14         yield {
    15             "id": i.group("id"),
    16             "title": i.group("title"),
    17             "rating_num": i.group("rating_num"),
    18             "comment_num": i.group("comment_num")
    19         }
    20 
    21 
    22 def main(num):
    23     url = 'https://movie.douban.com/top250?start=%s&filter=' %num
    24     response_html = getPage(url)
    25     ret = parsePage(response_html)
    26     print(ret)
    27     f = open("move_info7", "a", encoding="utf8")
    28 
    29     for obj in ret:
    30         print(obj)
    31         data = str(obj)
    32         f.write(data + "
    ")
    33 
    34 
    35 com = re.compile(
    36     '<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>d+).*?<span class="title">(?P<title>.*?)</span>'
    37     '.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S)
    38 
    39 count = 0
    40 for i in range(10):
    41     main(count)
    42     count += 25
  • 相关阅读:
    Spring--IOC--AOP
    SpringMVC
    elasticsearch为什么检索快?
    linux下无法启动webdriver问题
    python 日志组件
    纯js脚本操作excel
    箭头函数
    Vue与React对比
    Vue Router 路由懒加载
    Vue Router 路由守卫:完整的导航解析流程
  • 原文地址:https://www.cnblogs.com/cbslock/p/11153506.html
Copyright © 2011-2022 走看看