四、python学习-正则表达式
正则表达式
import re
lst = re.findall(正则表达式,需要匹配的字符串)
findall 把所有匹配到的字符串都搜出来,返回列表
不能把分组内容和匹配内容同时显示出来
search 只把搜索到一个结果就返回,返回对象
可以把分组内容和匹配的内容同时显示出来
group 对象.group() 直接获取匹配到的内容
groups 对象.groups() 直接获取分组里边的内容
1.预定义字符集
str = "caca/#%*!~cac'cac123"
- .匹配任意字符,除了换行符\n
- \d 匹配数字
- \D 匹配非数字
- \w 匹配字母 数字 下划线(正则函数中,支持中文的匹配)
- \W 匹配非字符 数字 下划线
- \s 匹配任意的空白符:、n \t \r " " ' '
- \S 匹配非任意的空白符
- \n 匹配换行符:re.findall(r"\n",str)
- \t 匹配空格:re.findall(r"\t",str)
- [] 匹配[]中列举的字符(^在字符组中,代表除了)
lst = re.findall("[abc]","jnjnnjnunun")=>None
re.finadll("a[abc]c","aac abb")=>aac
re.findall("a[0-9]b","a1b acb")=>a1b
re.findall("a[a-g]b","a1b acb")=>acb
re.findall("a[A-G]b","a1b acb aCb aYb")=>aCb
re.findall("a[0-9a-zA-z]b","a-b a1b aYb aqbalb")=>a1b aYb aqb alb
re.finadll("a[0-9][*#/]b","a1/b a2b a29b a56b")=>a1/b
# ^在字符组中,代表除了
re.findall('a[^-+*/]','a%b ccaa*bda&bd')=>a%b a&b
# 如果想要匹配^ 或者 -,在原来的字符加上\
re.findall(r'e[\^\-]f',"e^f e-f")=>e^F e-f
re.findall(r'a\\n','a\n')=>a\n
2.多个字符匹配
量词在那个字符后面就是谁的量词
- ? 匹配0个或者1个字符
- + 匹配1个或者多个
- * 匹配0个或者多个
- {m,n} 匹配m到n字符
import re
# 1<=x<=2
re.findall('a{1,3}b','aaab ab aab abbb aaz aabb')=>aaab ab aab ab aab
# x=2 前面修饰的a必须是两个字符
re.findall('a{2}b','aaab ab aab abbb aaz aabb')=>aab aab aab
# x>=2 至少是两个字符
re.findall('a{2,}b','aaab ab aab abbb aaz aabb')=>aaab aab aab
3.贪婪模式 与 非贪婪模式
贪婪模式 与 非贪婪模式:
贪婪模式:默认向更多次匹配,底层用的是回溯算法
非贪婪模式:默认向更少次匹配,用一个?来进行修饰(修饰在两次的身后)
回溯算法:从左向右进行匹配,一直到最后,直接最后再也匹配不到了,回头,寻找最后一个
strvar = "张三李四王五张四张五子acaca子443232"
re.findall("张.",strvar)=>张三 张四 张五
# 贪婪模式
re.findall("张.?",strvar)=>张三 张四 张五
re.findall("张.+",strvar)=>张三李四王五张四张五子acaca子443232
re.findall("张.*",strvar)=>张三李四王五张四张五子acaca子443232
re.findall("张.{1,21}",strvar)=>张三李四王五张四张五子acaca子443232
re.findall("张.*子",strvar)=>张三李四王五张四张五子acaca子
# 非贪婪模式
re.findall("张.??",strvar)=>张 张 张
re.findall("张.+?",strvar)=>张三 张四 张五
re.findall("张.*",strvar)=>张 张 张
re.findall("张.{1,21}?",strvar)=>张三 张四 张五
re.findall("张.*?子",strvar)=>张三李四王五张四张五子
4.边界符
# \b backspace 本身就是一个转义字符
边界符 卡单词word
卡住左边界 \bw
卡住右边界 d\b
import re
strvar = "word pwd scf"
re.findall(r".*d\b",strvar) 'word pwd'
re.findall(r".*?d\b",strvar) word,pwd
re.findall(r"\bw",strvar) 'w'
re.findall(r"\bw.*?",strvar) 'w'
# 正则表达式中写字符时,要谨慎,下面例子必须匹配到第一个空格时,才结束
re.findall(r"\bw.*? ",strvar) 'word '
re.findall(r"\bw\S",strvar) 'wo'
re.findall(r"\bw\S*",strvar) 'word'
^ 、 $
^ 必须以...开头
$ 必须以...结尾
如果出现了^ $,要把这个字符串看成一个整体
5.正则表达式-分组
- 正常分组
import re
strvar = "wu_good alex_good secret_good"
# 1.分组练习
re.findall('.*?_good',strvar) =>"wu_good" "alex_good" "secret_good"
# () 显示括号里边匹配到的内容
re.findall('(.*?)_good',strvar) =>"wu" "alex" "secret"
# ?: 不显示括号里边的内容
re.findall('(?:.*?)_good',strvar) =>"wu_good" "alex_good" "secret_good"
# 2. | 代表或,a|b代表 a 或 b
strvar = "abcddd"
re.findall("a|b",strvar) => a,b
# 注意事项:为啦避免优先匹配前面的字符串,导致字符串匹配不完整,把较难匹配到的字符串写在前面,容易匹配到的字符串放在后边
# 匹配abc 或者abcd
strvar = "abc121548112ddabcd21513"
re.findall("abc|abcd",strvar) => abc,abc
re.findall("abcd|abc",strvar) => abc,abcd
# 3.练习
# 匹配小数
re.findall(r"\d+\.\d+",str)
# 匹配小数和整数
re.findall(r"\d+\.\d+|\d+",strvar)
re.findall(r"\d+(?:\.\d+)?",strvar)
# 匹配135或者171的手机号
re.findall(r"(?:135|171)[0-9]{8}",strvar)
re.findall(r"^(?:135|171)[0-9]{8}$",strvar)
# 匹配www.baidu.com 或者 www.oldboy.com
re.findall(r"www.baidu.com|www.oldboy.com")
re.findall(r"www_(?:baidu|oldboy)_com")
# 获取第一个
obj = re.search(r"(?:www).(?:baidu|oldboy).(?:com)")
obj.group() =>www.baidu.com
# 获取分组()里边的数据
obj.groups() =>['www','baidu','com']
# “5*6-7/3” 匹配5*6 或者 7/3
print(re.findall('(?:\d+[*/]\d)|(?:\d/\d)',"5*6-7/3"))
- 命名分组
import re
strvar = "<div>123456</div>"
lst = re.findall(r"<(.*?)>(.*?)<(.*?)>",strvar)=> ['div','123456','/div']
# 1.反向引用
# \1代表反向引用,将第一个括号匹配的字符串,在\1位置处再引用一次
lst = re.findall(r"<(.*?)>(.*?)<(/\1)>",strvar)=> ['div','123456','/div']
strvar = "a1b2cab"
re.search(r"(.*?)\d(.*?)\d(.*?)\1\2",strvar)
# 2.命名分组(给小组命名)
语法:(?P<组名>正则表达式)给这个组起一个名字
(?P=组名) 引用之前组的名字,把该组名匹配到的内容放到当前位置
strvar = "a1b2cab"
re.search(r"(?P<tag1>.*?)\d(?P<tag2>.*?)\d(.*?)\1\2",strvar)
re.search(r"(?P<tag1>.*?)\d(?P<tag2>.*?)\d(.*?)(?P=tag1)(?P=tag2)",strvar)
6正则函数
- findall()
- search() 通过正则匹配出第一个对象就返回,通过group去除对象中的值,groups把括号里匹配到的内容丢到元组中返回
- match() search只要在正则表达式的前面加上^ 就和match一样
- split() 切割
import re
strvar = "alex|xboy&wusir-egon"
re.split("[|&-]",strvar)#alex xboy wusir egon
strvar = "alex242141xboy232523wusir1215egon"
re.split("[\d+]",strvar)#alex xboy wusir egon " "
- sub() 替换(正则表达式,替换的字符串,原字符串,[可选的替换次数})
import re
strvar = "alex|xboy&wusir-egon"
re.sub("[|&-]","%",strvar)# "alex%xboy%wusir%egon"
# 替换一次
re.sub("[|&-]","%",strvar)# re.sub("[|&-]","%",strvar,1)# "alex%xboy&wusir-egon"
- subn() 替换 与sub用法一样,区别在于返回值不同,返回的是元组
import re
strvar = "alex|xboy&wusir-egon"
re.sub("[|&-]","%",strvar)# "alex%xboy%wusir%egon",3
# 替换一次
re.sub("[|&-]","%",strvar)# re.sub("[|&-]","%",strvar,1)# "alex%xboy&wusir-egon",1
- finditer 匹配字符串中的相应内容,返回迭代器
from collections import Iterator
strvar = "safadsadsadas你好23342"
it = re.finditar(r"\d+",strvar)
isinstance(it,Iterabor)
for i in it:
i.group()
- compile 指定一个统一的匹配规则
正常情况下,正则表达式执行一次,编译一次
如果反复使用,会浪费系统资源,比如内存,cpu
compile 可以使正则编译一次,无序反复编译
strvar = "safadsadsaddsad155as你好23342"
pattern = re.compile(r"\d+")# re.compile('\\d+')返回的是对象
obj = pattern.search(strvar)
obj.group()#155
lst = pattern.findall(strvar)# ["155","23342"]
正则表达式修饰符 配合compile使用
- re.I 使匹配对大小写不敏感
strvar = "<h1>123</H1>"
pattern = re.compile("<h1>.*?</h1>",flag=re.I)
pattern.search(strvar).group() # 123
- re.M 使每一行都能单独匹配(多行匹配),影响^ $的使用
strvar = """<h1>123</H1>
<p>123</p>
<div>123</div>
"""
pattern = re.compile("^<.*?>(.*?)<.*?>$")
# 因为
pattern.findall(strvar) # []
# 使用re.M
pattern = re.compile("^<.*?>(.*?)<.*?>$",flag=re.M)
pattern.findall(strvar) # 123 123 123
- re.S 使.匹配包含换行在内的所有内容
strvar ="""give
112233mefive
"""
pattern = recompile("(.*?)mefive")
# 因为.匹配不到\n换行符
pattern.search(strvar).group()# 112233mefive
# 使用re.S 完善.
pattern = recompile("(.*?)mefive",flags=re.S)
pattern.search(strvar).group()# "give \n 112233mefive"
四、python学习-正则表达式的更多相关文章
- python学习——正则表达式
正则表达式 正则表达式的主要作用就是对字符串进行匹配,通过匹配,进行筛选,选择出符合规则的字符串.其实正则表达式的作用就像是一个过滤器一样.你输入好自己的 ...
- python学习 正则表达式
一.re 模块中 1.re.match #从开始位置开始匹配,如果开头没有match()就返回none 语法:re.match(pattern, string, flags=0) pattern 匹配 ...
- Python学习 ——正则表达式
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. re 模块使 Python 语言拥有全部的正则表达式功能. compile 函数根据一个模式字符串和可选的标志参数生 ...
- python学习-正则表达式(十)
1.查看re模块的全部属性和函数 >>>import re,pprint >>>pprint.pprint(re.__all__) ['match', 'fullm ...
- [python 学习]正则表达式
re 模块函数re 模块函数和正则表达式对象的方法match(pattern,string,flags=0) 尝试使用带有可选的标记的正则表达式的模式来匹配字符串.如果匹配成功,就返回匹配对象:如果失 ...
- 【Python学习笔记四】获取html内容之后,如何提取信息:使用正则表达式筛选
在能够获取到网页内容之后,发现内容很多,那么下一步要做信息的筛选,就和之前的筛选图片那样 而在python中可以通过正则表达式去筛选自己想要的数据 1.首先分析页面内容信息,确定正则表达式.例如想获取 ...
- Python学习笔记——正则表达式入门
# 本文对正则知识不做详细解释,仅作入门级的正则知识目录. 正则表达式的强大早有耳闻,大一时参加一次选拔考试,题目就是用做个HTML解析器,正则的优势表现得淋漓尽致.题外话不多讲,直接上干货: 1. ...
- 孤荷凌寒自学python第六十四天学习mongoDB的基本操作并进行简单封装3
孤荷凌寒自学python第六十四天学习mongoDB的基本操作并进行简单封装3 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十天. 今天继续学习mongoDB的简单操作, ...
- 大学四年的Python学习笔记分享之一,内容整理的比较多与仔细
翻到以前在大学坚持记录的Python学习笔记,花了一天的时间整理出来,整理时不经回忆起大学的时光,一眨眼几年就过去了,现在还在上学的你们,一定要珍惜现在,有个充实的校园生活.希望这次的分享对于你们有学 ...
随机推荐
- CNN专访灵石CTO:Baccarat流动性挖矿能否持续?
近日,CNN记者Robert独家专访Baccarat的项目团队CTO STEPHEN LITAN,跟他特别聊了聊DeFi的近况. 以下是专访全文: Robert:推出Baccarat的契机是什么? S ...
- spring框架aop用注解形式注入Aspect切面无效的问题解决
由于到最后我的项目还是有个邪门的错没解决,所以先把文章大概内容告知: 1.spring框架aop注解扫描默认是关闭的,得手动开启. 2.关于Con't call commit when autocom ...
- js 一元运算符
一元运算符还有一个常用的用法就是将自执行函数的function从函数声明变成表达式. 常用的有 + - - ! void + function () { } - function () { } ~ f ...
- 🤔 移动端 JS 引擎哪家强?美国硅谷找......
如果你喜欢我写的文章,可以把我的公众号设为星标 ,这样每次有更新就可以及时推送给你啦 在一般的移动端开发场景中,每次更新应用功能都是通过 Native 语言开发并通过应用市场版本分发来实现的.但是市场 ...
- 设置ViewPager 自动滑动时间,速度 方便展示动画
ViewPager.setCurrentItem(position),即使已设置动画,但是没有动画效果 原因:因为ViewPager滑动之前的时间间隔太短,可以通过反射,去修改ViewPager自动滑 ...
- HDOJ-3416(最大流+最短路+ISAP算法+向前星dijikstra算法+如何判断一条边是否在最短路中)
Marriage Match IV HDOJ-3416 这题的题意就是要找两点之间最短路的路径个数,而且边不能重复. 最大流和最短路的结合.首先正向和反向建图,再跑两遍dijikstra.到这里就求出 ...
- Java 基础加强 01
基础加强·网络编程 和 GUI 网络编程概述 * A:计算机网络 * 是指将地理位置不同的具有独立功能的多台计算机及外部设备,通过通信连接起来 在网路操作系统,网络管理软件和网络通信协议的管理下,实现 ...
- IDEA的下载、安装与破解
IDEA的下载.安装与破解 下载地址:https://www.jetbrains.com/idea/download/#section=windows 建议下载2018.2版本,方便破解 安装 一直下 ...
- C# 基础 - Enum 的一些操作
1. int 转换成 enum public enum Suit { Spades, Hearts, Clubs, Diamonds } Suit spades = (Suit)0; Suit hea ...
- springboot2.0全局异常处理,文件上传过大会导致,方法被执行两次,并且连接被重置
最后发现是内嵌tomcat也有文件大小限制,默认为2MB,我上传的是4MB,然后就炸了.在application.properties中添加server.tomcat.max-swallow-size ...