• python中的re模块


    一.re模块中的基本功能:
    1.查找
    1.1 findall:匹配所有每一项符合的结果都会放到列表中,作为一个元素
    用法:re.findall('正则表达式','待匹配的字符串',falg)
    1 ret=re.findall('d+','东方红5546fuy465胡')
    2 print(ret)#['5546', '465']
    1.2 search:只匹配符合条件的从左到右的第一个,得到的不是一个结果,而是一个变量,通过这个变量的group方法来获取结果
    如果没有匹配到,会返回none,使用group方法会报错
    1 ret=re.search('d+','东方红5546fuy465胡')
    2 print(ret)  #<_sre.SRE_Match object; span=(3, 7), match='5546'>
    3 print(ret.group())  #5546
    4 
    5 ret=re.search('_','东方红5546fuy465胡')
    6 print(ret)   #None
    7 print(ret.group())  # 'NoneType' object has no attribute 'group'
    1.3 match:从头开始匹配,相当于在search中加上一个'^'
    1 ret=re.match('d+','东方红5546fuy465胡')
    2 print(ret)  #None
    3 
    4 ret1=re.match('d+','12东方红5546fuy465胡')
    5 print(ret1.group())  #12
    2.字符串处理:替换切割
    2.1split:切割
    1 s='21东方红5546fuy465胡'
    2 ret=re.split('d+',s)
    3 print(ret)  #['', '东方红', 'fuy', '胡']
    4 
    5 s='21东方红5546fuy465胡'
    6 ret=re.split('d',s)#切一的时候默认前面有一个空字符串
    7 print(ret)  #['', '', '东方红', '', '', '', 'fuy', '', '', '胡']
    2.1 sub:替换 sub(旧的 新的 谁 替换次数(默认全部替换))
    1 ret=re.sub('d','@@@','12东方红5546fuy465胡')
    2 print(ret)#@@@@@@东方红@@@@@@@@@@@@fuy@@@@@@@@@胡
    3 
    4 ret=re.sub('d+','@@@','12东方红5546fuy465胡')
    5 print(ret)  #@@@东方红@@@fuy@@@胡
    6 
    7 subn  返回的是一个元组,元祖的第二个元素是替换的次数
    8 ret=re.subn('d+','@@@','12东方红5546fuy465胡')
    9 print(ret)  #('@@@东方红@@@fuy@@@胡', 3)
    3. re模块的进阶: 时间 空间
    3.1 compile(编译的意思):节省你使用正则表达式解决问题的时间
     1 ret=re.compile('d+')
     2 print(ret)  #re.compile('\d+')  编译后的正则表达式
     3 ret1=ret.findall('12东方红5546fuy465胡')
     4 print(ret1)  #['12', '5546', '465']
     5 
     6 ret=re.compile('d+')
     7 ret1=ret.search('12东方红5546fuy465胡')
     8 print(ret1.group())  #12
     9 ret2=ret.match('12东方红5546fuy465胡')
    10 print(ret2.group())   #12
    3.2 finditer :节省你使用正则表达式的空间/内存,返回一个迭代器,需要的话可以循环+group()或者__next__+group()
     1 ret=re.finditer('d+','12东方红5546fuy465胡')
     2 # print(ret)
     3 # for i in ret:
     4 #     print(i.group())
     5 # 12
     6 # 5546
     7 # 465
     8 
     9 # ret=re.finditer('d+','12东方红5546fuy465胡')
    10 # print(ret.__next__().group())  #12
    4 .分组在re模块中的使用
    之前
    1 s='<a>wahaha</a>'  #是一个标签语言 HTML网页  <a>表示开始 </a>表示结束
    2 ret=re.search('>w+<',s)
    3 print(ret.group())
    4.1
    1 s='<a>wahaha</a>'
    2 ret=re.findall('<w+>(w+)</(w+)>',s)
    3 print(ret)   #为了方便,优先使用显示分组中的内容
    4.2
    1 s='<a>wahaha</a>'
    2 ret=re.search('>(w+)<',s)
    3 print(ret.group())
    4 print(ret.group(1))  #数字代表取对应分组中的内容
    4.3 取消分组优先(?:正则表达式)
    ret=re.findall('d+(?:.d+)?','1.234*56')
    print(ret)   #['1.234', '56']
    4.4 分组与split方法
    1 ret = re.split('d+','alex83taibai40egon25')
    2 print(ret)  #['alex', 'taibai', 'egon', '']
    3 ret = re.split('(d+)','alex83taibai40egon25aa')
    4 print(ret)  #['alex', 'taibai', 'egon', '']
    4.5.1分组命名 (?P<这个组的名字>正则表达式)
    1 s='<a>wahaha</a>'
    2 ret=re.search('<(?P<start>w+)>(?P<content>w+)<(?P<end>/w+)>',s)
    3 print(ret.group(1))  #a   也可以使用序号
    4 print(ret.group('start'))  #a
    4.5.2 分组名相同
    1 partten='<(?P<start>w+)>(?P<content>w+)</(?P=start)>'
    2 s='<a>wahaha</a>'
    3 ret=re.search(partten,s)
    4 print(ret.group())  #<a>wahaha</a>
    5 禁止转义(原样输出)  r
    ret=re.findall(r"d+","1-2*(60+(-40.35/5)-(-4*3))")  #此处的r是禁止转义的意思
    # print(ret)
    
    # print('qwert')
    # print('qwert
    ')  #此时输出qwert和一个空行
    # print('qwert\n')  #此时输出qwert
    
    # print(r'qwert
    ')   #此时输出qwert
    
    # print(r'qwert\n')   #此时输出qwert\n
    二.爬虫实例
    将序号,电影,评分和评价人数爬下来
     1 import re
     2 from urllib.request import urlopen
     3 
     4 def getpage(url): #获取网页的字符串
     5     response=urlopen(url)
     6     return response.read().decode('utf-8')
     7 
     8 def parsepage(s):
     9     ret=com.finditer(s)
    10     for i in ret:
    11         yield {
    12             'id':i.group('id'),
    13             'name':i.group('name'),
    14             'score':i.group('score'),
    15             'speak':i.group('speak'),
    16         }
    17 
    18 def main(num):
    19     url='https://movie.douban.com/top250?start=%s&filter=' % num
    20     respoese_html=getpage(url)  #得到的是当前那页网页的所有字符串的str
    21     ret=parsepage(respoese_html)  #得到的是一个生成器
    22     print(ret)
    23     for i in ret:
    24         print(i)
    25 
    26 com=re.compile(
    27     '<div class="item">.*?<em class="">(?P<id>d+)</em>.*?<span class="title">(?P<name>.*?)</span>.*?'
    28     '<span class="rating_num" property="v:average">(?P<score>.*?)</span>.*?<span>(?P<speak>.*?)</span>',re.S)
    29 
    30 count=0
    31 for i in range(10):
    32     main(count)
    33     count+=25  #此网页的特点是25个电影一页

     



  • 相关阅读:
    复习一些奇怪的题目
    NOIP 考前 KMP练习
    NOIP 考前 并查集复习
    NOIP 考前 Tarjan复习
    NOIP 考前 图论练习
    BZOJ 1468 树分治
    Codeforces Round #376 (Div. 2)
    CodeVS 线段覆盖1~5
    Luogu 3396 权值分块
    BZOJ 2743 树状数组
  • 原文地址:https://www.cnblogs.com/shanghongyun/p/9494699.html
Copyright © 2020-2023  润新知