【Python学习笔记】(九)正则表达式:re模块
文章目录
- 正则表达式
- 元字符
- 正则表达式修饰符
- 正则表达式语法
- re模块
- re.match函数和re.search方法
- re.sub用于替换字符串中的匹配项
- re.compile 函数编译正则表达式
- findall和re.finditer查找匹配的所有子串
- 分组匹配
- 贪婪/非贪婪匹配
- 零宽断言
正则表达式
正则表达式(RE/regex/regexp):符合一定规则的表达式,是用于匹配字符串中字符组合的模式。
元字符
元祖父即正则表达式中有特殊意义的字符。若要表示元字符,可以加上转义字符’’。
元字符 | 描述 | l例子 |
---|---|---|
^ | 匹配输入的开始部分 | |
$ | 匹配输入的结束部分 | |
. | 除了\n以外的任意一个单个字符 | abc123@#$等等 |
[ ] | 范围 | [a-z]即小写字母中的任意一个 |
* | 0或者多次匹配前面那个字符 | 23*,可以匹配2、23、233、2333.。 |
+ | 1或者多次 | |
? | 0-或者次 | a?ve?可以匹配never中的ve |
() | 匹配模式并记住匹配项 | |
| | 或者 | x|y匹配x或y |
{n} | 精确匹配n(非负整数)次前面的字符 | 类似* |
{n,} | 至少匹配n次 | 类似+ |
{n,m} | 至少n次至多每次 | {0,1} 和?一样 |
[^abc] | 一个否定字符集 | |
\A | 仅匹配字符串开头 | |
\b | 匹配某个单词边界(单词与空格间的位置) | er\b匹配never中的er |
\B | 匹配非单词边界 | |
\d | 匹配数字 | 123467890 |
\D | 非数字 | |
\f \n \r | 依次匹配换页、换行、回车字符 | |
\s | 空白符 | 比如空格,tab键,换页字符 |
\S | 非空白符 | |
\t \v | 跳进,垂直跳进 | |
\w | 任何单词字符,包括下划线。 | 等效[A-Za-z0-9_] |
\W | 非单词 | 等效[^A-Za-z0-9_] |
\z | 仅匹配字符串的结尾 | |
\Z | 仅匹配字符串的结尾,或者结尾的换行符之前 |
限定符:指定输入中必须存在字符、组或者字符类的多少个实例才能找到匹配项。[元字符的组合]“\w[3]”可以匹配任意三位英文字母。
定位符:将正则表达式固定到行首或者行位。“^\w+”可以匹配“abc123”中的 “abc”.
分组构造:描述了正则表达式的子表达式,用于捕获输入字符串的子字符串。
用“(\w+)\s(\w+)\W”匹配字符串:He said | that that | was the | correct answer.
Markdown: 表格中的竖线(|)怎么输出?
匹配模式:指匹配的时候使用的规则。例如,不区分大小写模式、单行模式(改变元字符“.”不会匹配换行符)、多行模式(改变"$”和"^"的匹配方式,默认为整个字符串的起始位置和结束位置)。
正则表达式修饰符
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志。
正则表达式语法
re模块
re模块提供了与Perl类似的正则表达式匹配操作。
Perl正则表达式超详细教程
正则表达式的许多元字符都需要使用反斜线表示,看也可以在定义字符串时前面添加r前缀。
" r’\n’ ’“代表字符“\”和"n”,而不是换行符。
import repattern=re.compile(r'\d+')#编译正则表达式,生成一个Pattern对象。匹配至少一个数字m1=pattern.match("one123")#正则匹配。默认匹配整个字符串,只要找到一个匹配结果就返回结果。
print(m1)#None。与"o"不匹配
m2=pattern.match("one123two456",3,8)#查找字符串指定位置,匹配从位置3到5的字符
print(m2)#匹配到返回Match对象。<re.Match object; span=(3, 6), match='123'>
print(m2.group())#123m3=re.match(r'\d+',"one123")#直接匹配,只能匹配整个字符串
print(m3)m4=re.match(r'[a-z]+','Abcde',re.I)#使用忽略大小写
print(m4)#<re.Match object; span=(0, 5), match='Abcde'>m5=pattern.search("one123")#search使用方法和match一致。但只要字符串中包含匹配的子串
print(m5)#<re.Match object; span=(3, 6), match='123'>。对比m1m6=re.findall(r'\d{2}','one1234l56')#使用一致,搜索整个字符串,获取全部匹配结果
print(m6)#无论匹配是否成功都返回一个list对象。['12', '34', '56']m7=re.split(r'[\s\,\;]+',"a,b;;c d")#分割字符串,匹配空格逗号分号。
print(m7)#['a', 'b', 'c', 'd']s="hello 123 world 456 python"
p=re.compile(r'(\w+) (\w+)')#有个空格,没有的话不一样
m8=p.sub("hello world",s)#替换字符串
print(m8)#hello world hello world python
m9=p.sub("hello world",s,1)#只替换一次
print(m9)#hello world world 456 python
Pattern对象由re.compile() 返回
Match对象由match(),search()返回
findall()返回列表对象
Re库的Match对象
re.match函数和re.search方法
group/start/end/span方法
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
re.search 扫描整个字符串并返回第一个成功的匹配。
span()函数:以tuple形式返回范围
import re
print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配
print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配'''
None
(0, 3)
(0, 3)
(11, 14)
'''
re.sub用于替换字符串中的匹配项
原型:re.sub(pattern, repl, string, count=0, flags=0)
参数:
• pattern : 正则中的模式字符串。
• repl : 替换的字符串,也可为一个函数。
• string : 要被查找替换的原始字符串。
• count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
string1 = '我https://weibo.com/1699432410/GC59cqsyF们'
results = re.compile(r'[http|https]*://[a-zA-Z0-9.?/&=:]*', re.S)
string1 = re.sub(results, '', string1)
print(string1) # 我们
re.compile 函数编译正则表达式
compile 函数,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
原型:re.compile(pattern[, flags])
参数:
• pattern : 一个字符串形式的正则表达式
• flags: 可选,表示匹配模式,比如忽略大小写,多行模式等,
findall和re.finditer查找匹配的所有子串
findall在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
原型:findall(string[, pos[, endpos]])
可选参数起始终止位置。
re.finditer和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
原型:re.finditer(pattern, string, flags=0)
import repattern = re.compile(r'\d+') # 查找数字
result1 = pattern.findall('runoob 123 google 456')
print(result1)it = re.finditer(r"\d+","12a32bc43jf3")
for match in it: print (match.group() )
'''
['123', '456']
12
32
43
3
'''
分组匹配
import rep1=re.compile(r'\d-\d-\d')#不分组
m1=p1.match("1-2-3")
print(m1)#<re.Match object; span=(0, 5), match='1-2-3'>
print(m1.groups())#返回匹配的所有组组成的元组。()
print(m1.group())#用于获得某个匹配组的字符串,默认为0,返回所有组的匹配结果。1-2-3p2=re.compile(r'(\d)-(\d)-(\d)')#分组
m2=p2.match("1-2-3")
print(m2)#<re.Match object; span=(0, 5), match='1-2-3'>
print(m2.groups())#('1', '2', '3')
print(m2.group())#1-2-3m3=re.findall(r'(\d)-(\d)-(\d)','1-2-3 4-5-6')
print(m3)#[('1', '2', '3'), ('4', '5', '6')]
贪婪/非贪婪匹配
贪婪/非贪婪匹配指的是尽可能多地匹配字符串还是尽可能少地匹配字符串。默认贪婪匹配(多),在限定符后面加上“?”表示非贪婪匹配。
import rem1=re.findall(r'<.+>',r"<hello><world><python>")#贪婪
print(m1)#['<hello><world><python>']
m2=re.findall(r'<.+?>',r"<hello><world><python>")#非贪婪
print(m2)#['<hello>', '<world>', '<python>']
零宽断言
零度断言是一种零宽度的匹配,它匹配得内容不会保存到匹配结果中。表达式的匹配内容只是代表了一个位置,
字符 | 描述 |
---|---|
?= | 零宽度正预测先行断言,它断言自身出现的位置后面可以匹配后面跟的表达式 |
?<= | 正回顾后发,前面可以匹配 |
?! | 负预测先行,后面不可以匹配 |
?<! | 负回顾后发,前面不可能匹配 |
import res=r"eating apple seeing papper watching movie"m1=re.findall(r'(.+?)(?=ing)',s)#正预测先行
print(m1)#['eat', 'ing apple see', 'ing papper watch']m2=re.findall(r'(.+?)(?<=ing)',s)#正回顾后发
print(m2)#['eating', ' apple seeing', ' papper watching']
地址、手机号等正则表达式参考: 史上最全常用正则表达式大全
【Python学习笔记】(九)正则表达式:re模块相关推荐
- Python学习笔记:常用第三方模块3
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:常用第三方模块(1)
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:常用内建模块7XML
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:常用内建模块5
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:常用内建模块2:collections
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记九10:shelve模块
文章目录 7 .shelve模块 (1) 一个潜在的陷阱 (2) 一个简单的数据库示例 7 .shelve模块 下一章将介绍如何将数据存储到文件中,但如果需要的是简单的存储方案,模块shelve可 ...
- Python学习笔记:正则表达式
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记(迭代、模块扩展、GUI 、编码处理等)
PythonIDLE中的编码处理 http://www.tuicool.com/articles/NbyEBr 原文标题:Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来 ...
- Python学习笔记九:文件I/O
打印到屏幕: 1 #!/usr/bin/python 2 3 print "Python is really a great language,", "isn't it? ...
- 【懒懒的Python学习笔记九】
至此,已经掌握了Python的基本技能,在本章中将学习如何进行文件操作. 文件操作 从文件中读取文件 文本数据可存储大量数据,每当需要分析或者修改存储在文件中的信息的时候,读取文件就显得至关重要了. ...
最新文章
- 前端(移动端)开发利器Chrome Developer Tools秘籍(下)
- 探讨:COCO2017数据集中包含很多目标被标注为一个框bbox,是标注错误吗?
- java管理分类编写_java029学生管理系统的编写
- 怎样在virtualbox下WIN7共享XP的文件
- Mac没有winnt格式_Mac视频格式转换工具-H265 Converter Pro
- 删除oracle安装目录,Oracle 卸载
- CMOS Image Sensor的DVP接口硬件设计
- matlab gui算法,MATLAB GUI实现计算器(设计)
- 小提琴1234567位置图解_小提琴的指法图
- Arch Linux 安装卓懿(xDroid)AUR 包
- KETTLE4个工作中有用的复杂实例--1、数据定时自动(自动抽取)同步作业
- Help library 安装arcobjects for .NET异常问题
- android 7.0 漏洞利用,谷歌 Android 移动操作系统中的零日漏洞被攻击者利用
- 新锐房地产销售管理系统 (部分流程)技术解析(一)用三层架构搭建项目
- VOC2007数据集制作
- java绘制流程图基本元素,java绘制图片
- 2022年要面试的注意啦,Android面试题全网最全汇总
- 08-图7 公路村村通(浙大数据结构)
- 6、python-mongodb获取数据存储到sql server
- 学习C++的参考书目