1、re模块(#regex)

# 查找

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

import re
ret = re.findall('\d+','dawdawd154wadwad848')# 正则表达式,带匹配的字符串
print(ret)
#输出['154', '848']
ret = re.findall('\d','dawdawd154wadwad848')# 正则表达式,带匹配的字符串
print(ret)
#输出['1', '5', '4', '8', '4', '8']

# search : 只匹配从左到右的第一个,得到的不是直接的结果,而是一个变量,通过这个变量的group方法来获取结果

# 如果没有匹配到,会返回None,使用group会报错

import re
# ret = re.findall('\d+','dawdawd154wadwad848')
# print(ret)
# ret = re.findall('\d','dawdawd154wadwad848')
# print(ret)
ret = re.search('\d+','dawdawd154wadwad848')
print(ret)
#输出<_sre.SRE_Match object; span=(7, 10), match='154'>
# 内存地址,这是一个正则匹配的结果
print(ret.group())
#输出154
#只能取出第一个

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

re.search('^\d+','dawdawd154wadwad848')

# 字符串处理的扩展 : 替换 切割

# split

s = 'alex|taibai|egon|'
# print(s.split('|'))
# #输出['alex', 'taibai', 'egon', '']
# s = 'alex83taibai40egon25'
# ret = re.split('\d+',s)
# print(ret)
# #输出['alex', 'taibai', 'egon', '']

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

ret = re.sub('\d+','H','alex83taibai40egon25')
print(ret)
#输出alexHtaibaiHegonH
ret = re.sub('\d+','H','alex83taibai40egon25',1)
print(ret)
#输出alexHtaibai40egon25

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

ret = re.subn('\d+','H','alex83taibai40egon25')
print(ret)
#输出('alexHtaibaiHegonH', 3)

# re模块的进阶 : 时间/空间

# compile 节省你使用正则表达式解决问题的时间

ret = re.compile('\d+')   # 已经完成编译了
print(ret)
#输出re.compile('\\d+')
res = ret.findall('alex83taibai40egon25')
print(res)
#输出['83', '40', '25']
res = ret.search('sjkhk172按实际花费928')
print(res.group())
#输出172

# finditer 节省你使用正则表达式解决问题的空间/内存

ret = re.finditer('\d+','alex83taibai40egon25')
for i in ret:
print(i.group())
#输出83 40 25

#总结

# findall 返回列表 找所有的匹配项
# search 匹配就 返回一个变量,通过group取匹配到的第一个值,不匹配就返回None,group会报错
# match 相当于search的正则表达式中加了一个'^'
# spilt 返回列表,按照正则规则切割,默认匹配到的内容会被切掉
# sub/subn 替换,按照正则规则去寻找要被替换掉的内容,subn返回元组,第二个值是替换的次数
# compile 编译一个正则表达式,用这个结果去search match findall finditer 能够节省时间
# finditer 返回一个迭代器,所有的结果都在这个迭代器中,需要通过循环+group的形式取值 能够节省内存

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

# 标签语言 html 网页

import re
s = '<a>wahaha</a>' # 标签语言 html 网页
ret = re.search('<(\w+)>(\w+)</(\w+)>',s)
print(ret.group()) # 所有的结果 <a>wahaha</a>
print(ret.group(1)) # 数字参数代表的是取对应分组中的内容 a
print(ret.group(2)) # 输出wahaha
print(ret.group(3)) # 输出a

# 为了findall也可以顺利取到分组中的内容,有一个特殊的语法,就是优先显示分组中的内容

import re
s = '<a>wahaha</a>'
ret = re.findall('(\w+)',s)
print(ret)
#输出['a', 'wahaha', 'a']
ret = re.findall('>(\w+)<',s)
print(ret)
#输出['wahaha']

# 取消分组优先(?:正则表达式)

ret = re.findall('\d+(\.\d+)?','1.234*4')
print(ret)
#输出['.234', '']

# 关于分组

# 对于正则表达式来说 有些时候我们需要进行分组,来整体约束某一组字符出现的次数
# (\.[\w]+)?
# 对于python语言来说 分组可以帮助你更好更精准的找到你真正需要的内容
# <(\w+)>(\w+)</(\w+)>

# 分组命名 (?P<这个组的名字>正则表达式)

s = '<a>wahaha</a>'
ret = re.search('>(?P<con>\w+)<',s)
print(ret.group(1))#输出wahaha
print(ret.group('con'))#输出wahaha

# 使用前面的分组 要求使用这个名字的分组和前面同名分组中的内容匹配的必须一致

s = '<a>wahaha</a>'
pattern = '<(?P<tab>\w+)>(\w+)</(?P=tab)>'
ret = re.search(pattern,s)
print(ret)

# 精准的取到整数 过滤掉小数

ret=re.findall(r"\d+\.\d+|(\d+)","1-2*(60+(-40.35/5)-(-4*3))")
ret.remove('')
print(ret)

3、爬虫实例

import re
from urllib.request import urlopen def getPage(url): # 获取网页的字符串
response = urlopen(url)
return response.read().decode('utf-8') def parsePage(s):
ret = com.finditer(s) # 从s这个网页源码中 找到所有符合com正则表达式规则的内容 并且以迭代器的形式返回
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): # 0 25 50 # 这个函数执行10次,每次爬取一页的内容
url = 'https://movie.douban.com/top250?start=%s&filter=' % num
response_html = getPage(url) # response_html就是这个url对应的html代码 就是 str
ret = parsePage(response_html) # ret是一个生成器
print(ret)
f = open("move_info7", "a", encoding="utf8")
for obj in ret:
print(obj)
data = str(obj)
f.write(data + "\n")
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 += 25

python note 16 re模块的使用的更多相关文章

  1. Python(五)模块

    本章内容: 模块介绍 time & datetime random os sys json & picle hashlib XML requests ConfigParser logg ...

  2. [转载]Python中的sys模块

    #!/usr/bin/python # Filename: cat.py import sys def readfile(filename): '''Print a file to the stand ...

  3. Python 五个常用模块资料 os sys time re built-in

    1.os模块   os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果.   os.name:返回当前操作系统名称('posix', 'nt', ' ...

  4. Python中的random模块,来自于Capricorn的实验室

    Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 < ...

  5. Python基础之--常用模块

    Python 模块 为了实现对程序特定功能的调用和存储,人们将代码封装起来,可以供其他程序调用,可以称之为模块. 如:os 是系统相关的模块:file是文件操作相关的模块:sys是访问python解释 ...

  6. Python自动化之常用模块

    1 time和datetime模块 #_*_coding:utf-8_*_ __author__ = 'Alex Li' import time # print(time.clock()) #返回处理 ...

  7. Python学习笔记-常用模块

    1.python模块 如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失.因此,如果你想要编写一些更大的程序,为准备解释器输入使用一个文本编辑器会更好,并以那个文件替代作 ...

  8. Python中的logging模块

    http://python.jobbole.com/86887/ 最近修改了项目里的logging相关功能,用到了python标准库里的logging模块,在此做一些记录.主要是从官方文档和stack ...

  9. Python处理时间 time && datetime 模块

    Python处理时间 time  &&  datetime 模块 个人整理,获取时间方式: import datetime import time #获取当前时间:Thu Nov 03 ...

随机推荐

  1. The type 'System.Object' is defined in an assembly that is not referenced

    记录一个错误,报 The type 'System.Object' is defined in an assembly that is not referenced,[System.Runtime] ...

  2. VS2015创建类库项目后添加不了WPF资源字典,窗口,用户控件处理办法

    打开项目工程文件在PropertyGroup标签最后加上下面3行: <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FA ...

  3. 数据库中id为自增

    使用find_and_modify函数可以设置mongo的id为自增 且可以支持原有的高并发操作,find_and_modify函数完成更新查找两个操作其是原子性的操作 代码:(auto_id.py) ...

  4. 快速傅里叶变换(FFT)时间复杂度

    图:信号在时域上和频域上的直观表示 1. 计算一维离散傅里叶变换(DFT)公式如下: 其中,N表示数据长度.由上式可知,DFT的时间复杂度是O(N*N) 2. 一维FFT的时间复杂度为O(N*logN ...

  5. nodejs版 阿里云开放api签名算法

    阿里云 API 签名 github:https://github.com/liuyinglong/aliyun; npm :https://www.npmjs.com/package/aliyun-a ...

  6. windows环境下安装rabbitmq及配置可视化管理界面

    1.环境 windows7 64位 rabbitmq3.7.9 erlang10.22.先安装erlang,后安装rabbitmq.下载地址: rabbitmq http://www.rabbitmq ...

  7. 用phpstudy配置网站遇到的一些问题

    第一次是配置在我本机,总是连不上数据库,后来查看到mysql.ini配置文件里面端口号有一个不是3306,更改之后就好了. 第二次是配置在笔记本电脑上,安装的时候比较顺利,也就遇到80端口被占用还有缺 ...

  8. Word2vec教程

    Word2vec Tutorial RADIM ŘEHŮŘEK 2014-02-02GENSIM, PROGRAMMING157 COMMENTS I never got round to writi ...

  9. 记一次Monolog的BufferHandler使用

    laravel中可以设置自定义的日记channel(config/logging中设置),按照laravel-china的一篇文章,把log按一定格式并且以批量的方式写入日志文件: https://l ...

  10. Dnsmasq 配置PXE批量安装系统

    以下测试都是基于centos 7下的环境 需要安装的软件为 nginx 用来下载ks.cfg和系统镜像文件用的,也可以用ftp服务器来代替 dnsmasq 提供dhcp服务和tftp服务,也可以单独去 ...