博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
14python模块之re
阅读量:5121 次
发布时间:2019-06-13

本文共 2850 字,大约阅读时间需要 9 分钟。

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 = 'wahaha'3 ret = re.findall('>(\w+)<',s)4 print(ret)   # 预期:>wahaha<   实际:wahaha  就是分组优先5 ret2 = re.findall('>(?:\w+)<',s)  #组内最前面加上?:表示取消分组优先6 print(ret2)   # 正常打印

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

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

  2.3分组命名

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

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

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

1 import re2 s = 'wahaha'3 ret = re.search('<(\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=' %num24     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 + "\n")33 34 35 com = re.compile(36     '
.*?
.*?
(?P
\d+).*?
(?P.*?)</span>'37 '.*?(?P
.*?)
.*?(?P
.*?)评价
', re.S)38 39 count = 040 for i in range(10):41 main(count)42 count += 25

 

转载于:https://www.cnblogs.com/cbslock/p/11153506.html

你可能感兴趣的文章
Android 获取网络链接类型
查看>>
linux中启动与终止lnmp的脚本
查看>>
gdb中信号的处理[转]
查看>>
LeetCode【709. 转换成小写字母】
查看>>
如何在Access2007中使用日期类型查询数据
查看>>
CF992E Nastya and King-Shamans(线段树二分+思维)
查看>>
第一个Java Web程序
查看>>
树状数组_一维
查看>>
如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下:
查看>>
linux install ftp server
查看>>
嵌入式软件设计第8次实验报告
查看>>
算法和数据结构(三)
查看>>
Ubuntu下的eclipse安装subclipse遇到没有javahl的问题...(2天解决了)
查看>>
alter database databasename set single_user with rollback IMMEDIATE 不成功问题
查看>>
WCF揭秘——使用AJAX+WCF服务进行页面开发
查看>>
【题解】青蛙的约会
查看>>
IO流
查看>>
mybatis调用存储过程,获取返回的游标
查看>>
设计模式之装饰模式(结构型)
查看>>
面向对象的设计原则
查看>>