python之正则表达式及RE模块
正则表达式(匹配字符串)
web界面正则匹配工具:
http://tool.chinaz.com/regex/
元字符

1 . 匹配除换行符之外的任意字符
2 \w 匹配数字字母下划线
3 \d 匹配数字
4 \t 匹配制表符
5 \n 匹配换行符
6 \s 匹配空白符(包含,空格,制表符和换行符)
7 \b 单词的边界
8 \W 匹配非数字字母下划线
9 \S 匹配非空白符
10 \D 匹配非数字
11 ^ 匹配开始符
12 $ 匹配结束符
13 | 或者,如果是有包含关系的,长的放左边
14 [] 匹配字符组,具体的范围
15 [^...] 匹配非字符组中的字符
16 () 匹配括号内的是一组
17
18
19 转义符
20 如果在测试工具中测试正常的代码拿到python中,由于转义符的问题搞不定,那么就直接在字符串外面+r
21 print('\\\\n')
22 print('\\n')
23 print(r'\\n')
24 print(r'\n')
25
26 事例:
27 www\.(baidu|google)\.com
28 [0-9] == [0123456789] #表示0到9的所有数
29 [a-z]/[A-Z] 表示a到z/A-Z所有英文字母
30 [A-Za-z0-9] 表示数字和大小写字母
31
32
33 量词
34 贪婪匹配: 尽可能多的匹配(默认模式)
35 {n} 匹配n次
36 {n,} 匹配至少n次至多无限次
37 {n,m} 匹配至少n次至多m次
38 * 匹配前面字符0次或多次
39 + 匹配前面字符1次或多次
40 非贪婪/惰性匹配
41 ? 匹配前面字符0次或1次(.*?)
42 abbbx 正则^ab+?x,如果正则是^ab+?结果则是ab
43
44
45 总结
46 正则表达式: 不仅仅要能匹配出对的,还要尽量避免匹配错误的,提高精准度
47 分组的作用: 分组也可以和量词连用,表示这一个组遵循某个量词的约束
48
49 常用的非贪婪匹配
50 *? 重复任意次,但尽可能少重复
51 .*? 匹配前边任意字符,尽可能少的匹配
52 +? 重复1次或更多次,但尽可能少重复
53 ?? 重复0次或1次,但尽可能少重复
54 .?x 取尽量少的任意字符,直到一个x出现

re的功能是在python中执行正则表达式
re模块下的常用方法
import re
re.findall 正则 待匹配字符串,列表,所有符合的项
re.search 变量.group取结果,只有一项结果
re.match 变量.group取结果,默认在正则之前加上^
re.finditer 把匹配的结果存放在迭代器中
re.findall('正则表达式','带匹配的字符')

1 re.findall('正则表达式','带匹配的字符')
2 ret = re.findall('\d+','aaa83bbb38')
3 print(ret)
4 结果
5 ['83', '38']
6 事例2
7 ret = re.findall('\d','aaa83bbb38')
8 print(ret)
9 结果
10 ['8', '3', '3', '8']
11
12 # ?:把括号python中的分组变成了原来正则表达式中的分组
13 lst = re.findall(r"a(?:\d+)c", "a123456c")
14 l2 = re.findall(r"a(\d+)c", "a123456c")
15 print(lst)
16 print(l2)
17 结果
18 ['a123456c']
19 ['123456']

re.finditer() #返回一个存放匹配结果的迭代器,节省空间

1 ret = re.finditer('\d+','linux83admin60yuan25')
2 print(ret) #直接打印返回的是一个迭代器
3 print(next(ret).group()) #查看第1个结果
4 for r in ret: #查看剩余的结果
5 print(r.group())
6 结果
7 <callable_iterator object at 0x000001FF0EACEBA8>
8 83
9 60
10 25

search 搜索, 查找
一旦匹配到结果,直接返回,如果匹配不到结果,返回None

1 ret = re.search('\d','aaa83bbb38')
2 print(ret) #返回的匹配结果,而不是具体的值
3 print(ret.group()) #从左到右找到第一个匹配的取出
4 结果
5 <_sre.SRE_Match object; span=(4, 5), match='8'>
6 8
7
8 ret = re.search('\d+','aaa83bbb22')
9 print(ret.group())
10 结果
11 83

match匹配,从头开始匹配,相当于在你正则前面加了一个^

1 ret = re.match('\d+','83aaa222bbb38')
2 print(ret.group())
3 等于
4 ret = re.search('^\d+','83aaa222bbb38')
5 print(ret)
6 结果
7 83

search和match的区别:
search查找,找到了结果就返回
match,从头开始匹配
给分组正则匹配定义一个名字(?P<名字>正则表达式)
1 ret = re.finditer(r'姓名:(?P<name>.*?),地址:(?P<address>.*?),','姓名:bob,地址:迪拜,年龄:18')
2 for i in ret:
3 print(i.group('name'),i.group('address'))
4 结果
5 bob 迪拜
re.split():分割
1 st = 'linux83admin60yuan25test'
2 ret = re.split('\d+',st) #按照一个或多个数字进行分割
3 print(ret)
4 结果
5 ['linux', 'admin', 'yuan', 'test']
sub用正则替换
1 s = 'linux83admin60yuan25'
2 ret = re.sub('\d+','_|_',s,1) #将一个或多个数字替换为_|_,1表示只替换1个,以字符串形式返回
3 print(ret)
4 结果
5 linux_|_admin60yuan25
subn显示替换次数
1 ret = re.subn('\d+','_|_',s) #将一个或多个数字替换为_|_,以元组形式返回
2 print(ret)
3 结果
4 ('linux_|_admin_|_yuan_|_', 3)
re.compile():编译后引用正则匹配(返回列表)
1 ret = re.compile('\d+') #将正则编译成一个正则对象,匹配一个或多个数字
2 lst = ret.findall('linux83admin60yuan25')
3 print(lst)
4 在多次执行同一个正则表达式的时候compile事先编译
案例:爬取电影天堂

1 import re
2 from urllib.request import urlopen
3
4 content = urlopen("https://www.dytt8.net/html/gndy/dyzz/20181228/57986.html").read().decode("gbk")
5 # print(content)
6
7 reg = r'<div id="Zoom">.*?片 名(?P<name>.*?)<br />◎年 代(?P<years>.*?)<br />.*?◎上映日期(?P<date>.*?)<br />'+ \
8 '.*?◎主 演(?P<main>.*?)◎简 介.*?<td style="WORD-WRAP: break-word" bgcolor="#fdfddf"><a href="(?P<download>.*?)">'
9
10 it = re.finditer(reg, content, re.S) # re.S 去掉.里面的\n
11
12 for el in it:
13 print(el.group("name"))
14 print(el.group("years"))
15 print(el.group("date"))
16 print(el.group("main").replace("<br /> ", ", "))
17 print(el.group("download"))
18
19 结果
20 黄金兄弟 / 新古惑仔 / 新版古惑仔 / 黄金七十二小时
21 2018
22 2018-09-20(中国香港) / 2018-09-21(中国)
23 郑伊健 Ekin Cheng , 陈小春 Jordan Chan , 谢天华 Michael Tse , 钱嘉乐 Kar Lok Chin , 林晓峰 Jerry Lamb , 曾志伟 Eric Tsang , 佘诗曼 Charmaine Sheh , 张雅玫 Yamei Zhang <br /><br />
24 ftp://ygdy8:ygdy8@yg45.dydytt.net:8373/阳光电影www.ygdy8.com.黄金兄弟.BD.720p.粤语中字.mkv

其他

1 事例1
2 ret = re.findall(r'\d+(\.\d+)?','2.34+666.87')
3 print(ret)
4 结果
5 ['.34', '.87']
6 #\d+ = 2 (\.\d+) = .34
7 #\d+ = 666 (\.\d+) = .87
8 #findall 优先显示分组中匹配到的内容
9
10 #如果想匹配浮点数就要把默认的非婪模式改为?:贪婪模式
11 ret = re.findall(r'\d+(?:\.\d+)?','2.34+666.87')
12 print(ret)
13 结果
14 ['2.34', '666.87']
15
16
17 事例2
18 ret = re.findall('www\.(?:baidu|google)\.com','www.baidu.com')
19 print(ret)
20 结果
21 ['www.baidu.com']
22
23 ret = re.findall('www\.(baidu|google)\.com','www.baidu.com,www.google.com')
24 print(ret)
25 结果
26 ['baidu', 'google']
27
28
29 ()组事例
30 ret = re.search('(www)\.(baidu|google)\.(com)','www.baidu.com,www.google.com')
31 print(ret)
32 print(ret.group())
33 print(ret.group(0))
34 print(ret.group(1))
35 print(ret.group(2))
36 print(ret.group(3))
37 结果
38 <_sre.SRE_Match object; span=(0, 13), match='www.baidu.com'>
39 www.baidu.com
40 www.baidu.com
41 www
42 baidu
43 com

python之正则表达式及RE模块的更多相关文章
- 【转】Python之正则表达式(re模块)
[转]Python之正则表达式(re模块) 本节内容 re模块介绍 使用re模块的步骤 re模块简单应用示例 关于匹配对象的说明 说说正则表达式字符串前的r前缀 re模块综合应用实例 参考文档 提示: ...
- Python之正则表达式(re模块)
本节内容 re模块介绍 使用re模块的步骤 re模块简单应用示例 关于匹配对象的说明 说说正则表达式字符串前的r前缀 re模块综合应用实例 正则表达式(Regluar Expressions)又称规则 ...
- Python与正则表达式[0] -> re 模块的正则表达式匹配
正则表达式 / Regular Expression 目录 正则表达式模式 re 模块简介 使用正则表达式进行匹配 正则表达式RE(Regular Expression, Regexp, Regex) ...
- python与正则表达式:re模块详解
re模块是python中处理正在表达式的一个模块 正则表达式知识储备:http://www.cnblogs.com/huamingao/p/6031411.html 1. match(pattern, ...
- python之正则表达式和re模块一
摘要:正则表达式 re模块 一.正则表达式:只和字符串打交道,是一种用来约束字符串的规则 1.应用场景: 1,判断某一个字符串是否符合规则:注册页-判断手机号.身份证号 是否合法 注册某个账号的时候, ...
- Python之正则表达式与常用模块(Day19)
一.正则表达式:匹配字符串的一种规则 正则表达式的在线测试工具: http://tool.chinaz.com/regex/ 字符组: 正则 待匹配字符 匹配结果 说明 [0123456789] 8 ...
- python之正则表达式(re模块)用法总结
用一句表示正则表达式,就是 字符串的模糊 匹配
- Python的正则表达式re模块
Python的正则表达式(re模块) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Python使用re模块提供了正则表达式处理的能力.如果对正则表达式忘记的一干二净的话,可以花费 ...
- python的正则表达式 re
python的正则表达式 re 本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以是Unicode字符,这点不用担心,python会处理地和Ascii字符一 ...
随机推荐
- JQuery Mobile - 固定住页面和页脚
在点击页面空白时候,页眉和页脚会隐藏,在页眉和页脚加入以下代码就可以了: data-tap-toggle ="false" 例子: <div data-role=" ...
- 使用FFmpeg如何转发一个RTSP视频流
版权声明:转载请说明出处:http://www.cnblogs.com/renhui/p/6930221.html 转发RTSP流,这类需求一般出现于转发一些摄像头采集视频,并在摄像头上做RTSP ...
- WebRTC 学习之 Conference 实现混音混屏
混音 混音的意义就是将多个音频流混成一路音频,在Conference 的实现中有分为终端实现和服务器实现. 1. 终端混音实现: 终端接受到多路(一般是多个用户)的音频流之后,在终端本地将多路音频流混 ...
- LinkedList 的源码分析
LinkedList是基于双向链表数据结构来存储数据的,以下是对LinkedList 的 属性,构造器 ,add(E e),remove(index),get(Index),set(inde,e)进 ...
- SQL-2--TRIGGER
触发器TRIGGER 是一个被指定关联到一个表的数据库对象,当对一个表的特定事件出现时,它将被激活. 触发器是数据库响应 INSERT , UPDATE, DELITE 语句而自动执行的一条SQL语句 ...
- python中匿名函数lambda
简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命 名一个函数的场合下使用,也就是指匿名函数. 先看它的几个用法: map( lambda x: x*x, [y f ...
- linux系统学习方法分享
初学者可以自己安装虚拟机,然后把 linux 常用命令例如 cd.ls.chmod.useradd.vi 等等多练习几十遍,把自己敲打命令的熟练程度提升上来.然后根据文档搭建 Linux 下常见的各种 ...
- 【xsy1503】 fountain DP
题目大意:给你$D$个格子,有$n$个喷水器,每个喷水器有一个喷水距离$r_i$. 现在你需要在这$D$个格子中选择$n$个位置按照任意顺序安装这$n$个喷水器,需要满足$n$个喷水器互相喷不到对方. ...
- Linux_CentOS-服务器搭建 <一>
本人CentOS版本6.3 必备的两个小软件: 安装PUTTY远程控制linux的非常小但非常好用的小工具. 安装WINSCP,使用ssh实现我windows上和linux服务器上文件的互传. 呵呵, ...
- 协程及Python中的协程
1 协程 1.1协程的概念 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程.(其实并没有说明白~) 我觉得单说协程,比较抽象,如果对线程有一定了解 ...