python正则表达式入门
文章目录
- 1 特殊字符罗列
- 匹配某种字符类型
- 特殊字符1 .:表示匹配除了换行符之外的任何单个字符
- 特殊字符2 *:表示匹配前面的子表达式任意次,包括0次
- 特殊字符3 +:表示匹配前面的子表达式一次或多次,不包括0次
- 特殊字符4 {}:匹配连续多次
- 特殊字符5 \:转义元字符
- 特殊字符6 []:匹配里面任意一个字符
- 特殊字符7 ^:起始位置
- 特殊字符8 $:结束位置
- 特殊字符9 ():组选择
- 特殊字符10 ?:表示匹配前面的子表达式0次或1次
- 2 re包方法
- 2.1 re.match(pattern, string, flags=0)
- 2.2 re.search(pattern, string, flags=0)
- 2.3 findall(string[, pos[, endpos]])
- 2.3 re.compile(pattern[, flags])
- 2.4 re.split
- 2.5 re.sub(pattern, repl, string, count=0, flags=0)
- 贪婪的特殊字符,“*”,“+”,"?"
- 练习
文章内容是看完b站教程:Python编程:正则表达式的笔记,部分内容摘自Python 正则表达式
1 特殊字符罗列
学习正则表达式,首先一定要清楚各类正则表达式符号的含义。
.:表示匹配除了换行符之外的任何单个字符
*:表示匹配前面的子表达式任意次,包括0次
+:表示匹配前面的子表达式一次或多次,不包括0次
?:表示匹配前面的子表达式0次或1次
\:转义
[]:表示要匹配某几种类型的字符
^:开始位置
$:结束位置
{}:表示前面的字符匹配指定的次数
|:或
():组选择
匹配某种字符类型
\d 匹配0-9之间任意一个数字字符,等价于表达式[0-9]
\D 匹配任意一个不是0-9之间的数字字符,等价于表达式[^0-9]
\s匹配任意一个空白字符,包括空格、tab、换行符等,等价于表达式[\t\n\r\f\v]
\S匹配任意一个非空白字符,等价于表达式[^\t\n\r\f\v]
\w匹配任意一个文字字符,包括大小写字母、数字、下划线,等价于表达式[a-zA-Z0-9_]
缺省情况也包括Unicode文字字符,如果指定ASCII码标记,则只包括ASCII字母
source='''
王亚辉
tony
刘文武
'''import re
p=re.compile(r'\w{2,4}')#全匹配
p=re.compile(r'\w{2,4}',re.A)#只匹配'tony'print(p.findall(source))
\W匹配任意一个非文字字符,等价于表达式[^a-zA-Z0-9_]
反斜杠也可以用在方括号里面,比如[\s,.]表示匹配:任何空白字符,或者逗号,或者点
下面对各个特殊字符一一说明。
特殊字符1 .:表示匹配除了换行符之外的任何单个字符
content='''苹果是绿色的
橙子是橙色的
香蕉是黄色的
乌鸦是黑色的'''
import re
p=re.compile(r'.色')# r的含义是纯文本,忽略转义 # compile返回一个pattern类,可用各种常见方法处理
for one in p.findall(content):# findall返回list,list里的元素是字符串print(one)
运行结果为
绿色
橙色
黄色
黑色
特殊字符2 *:表示匹配前面的子表达式任意次,包括0次
content='''苹果,是绿色的
橙子,是橙色的
香蕉,是黄色的
乌鸦,是黑色的'''
正则表达式
,.*
代表匹配逗号后面的所有字符。content的匹配结果为
,是绿色的
,是橙色的
,是黄色的
,是黑色的
特殊字符3 +:表示匹配前面的子表达式一次或多次,不包括0次
.+和.*类似,不同的是+匹配至少1次,而*可以匹配0次
特殊字符4 {}:匹配连续多次
表达式 油{3,4}表示匹配连续的油字至少3次,至多4次
\d{11}提取连续11个数字,如手机号是11位的
特殊字符5 \:转义元字符
比如要在下面的文本中搜索 所有点前面的字符串,也包括点本身
苹果.是绿色的
橙子.是橙色的
香蕉.是黄色的
因为要搜索的内容本身就包含元字符,可以使用反斜杠进行转义,使用.*\.
即可
特殊字符6 []:匹配里面任意一个字符
[abc]可以匹配abc里面的任意一个字符。等价于[a-c]
[a-c]中间-表示一个范围从a到c
一些元字符在方括号内就是普通字符,如[akm.]匹配a k m .里面任意一个字符
特殊字符7 ^:起始位置
如果在方括号里使用^,表示非方括号里面的字符集合
^表示匹配文本的起始位置。
正则表达式可以设定单行模式和多行模式
如果是单行模式,表示匹配整个文本的开头位置
如果是多行模式,表示匹配文本每行的开头位置。
python代码缺省是单行模式,如果设置多行模式
content='''001-苹果价格-60
002-橙子价格-70
003-香蕉价格-80
'''import re
p=re.compile(r'^\d+',re.M)#re.M表示设置多行模式
for one in p.findall(content):print(one)
运行结果
001
002
003
特殊字符8 $:结束位置
一样有单行模式和多行模式
特殊字符9 ():组选择
content='''苹果,苹果是绿色的
橙子,橙子是橙色的
香蕉,香蕉是黄色的
'''
import re
p=re.compile(r'^(.*),',re.M)
for one in p.findall(content):print(one)"""最后结果
苹果
橙子
香蕉
"""
content='''张三,手机号码18350505050
张四,手机号码18350505051
张五,手机号码18350505052
'''
import re
p=re.compile(r'^(.+),.+(\d{11})',re.M)
for one in p.findall(content):print(one)
"""最后结果
('张三','18350505050')
('张四','18350505051')
('张五','18350505052')
"""
特殊字符10 ?:表示匹配前面的子表达式0次或1次
等价于{0,1}
2 re包方法
re是有关正则表达式的包。上面讲解主要用到了recompile和findall方法。
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None
re.search匹配整个字符串,直到找到一个匹配。
match 和 search 是匹配一次,findall 匹配所有。
详细使用可以另查资料,下文只简略带过。
2.1 re.match(pattern, string, flags=0)
函数参数说明:
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串。 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 |
正则表达式可选标志:
- re.I 使匹配对大小写不敏感
- re.L 做本地化识别(locale-aware)匹配
- re.M 多行匹配,影响 ^ 和 $
- re.S 使 . 匹配包括换行在内的所有字符
- re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
- re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None
2.2 re.search(pattern, string, flags=0)
re.search匹配整个字符串,直到找到一个匹配。
2.3 findall(string[, pos[, endpos]])
match 和 search 是匹配一次,findall 匹配所有。
import repattern = re.compile(r'\d+') # 查找数字
result1 = pattern.findall('runoob 123 google 456')
result2 = pattern.findall('run88oob123google456', 0, 10)print(result1)
print(result2)'''输出结果
['123', '456']
['88', '12']
'''
2.3 re.compile(pattern[, flags])
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
参数:
- pattern : 一个字符串形式的正则表达式
- flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
- re.I 忽略大小写
- re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
- re.M 多行模式
- re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
- re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
- re.X 为了增加可读性,忽略空格和 # 后面的注释
content='''张三,手机号码18350505050
张四,手机号码18350505051
张五,手机号码18350505052
'''
import re
p=re.compile(r'^(.+),.+(\d{11})',re.M)
for one in p.findall(content):print(one)
"""最后结果
('张三','18350505050')
('张四','18350505051')
('张五','18350505052')
"""
2.4 re.split
Import re
names='关羽;张飞,赵云, 马超,黄忠 李逵'
# 以下正则表达式指定了,分隔符为分号、逗号、空格里面的任意一种,并且该符号周围可以有不定数量的空格
namelist= re split(r'[;,\s]\s*', names)
print(namelist)
2.5 re.sub(pattern, repl, string, count=0, flags=0)
参数:
- pattern : 正则中的模式字符串。
- repl : 替换的字符串,也可为一个函数。(是函数的话不会用)
- string : 要被查找替换的原始字符串。
- count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
import re
phone = "2004-959-559 # 这是一个国外电话号码"
# 删除字符串中的 Python注释
num = re.sub(r'#.*$', "", phone)
print "电话号码是: ", num
# 删除非数字(-)的字符串
num = re.sub(r'\D', "", phone)
print "电话号码是 : ", num
'''结果
电话号码是: 2004-959-559
电话号码是 : 2004959559
'''
names='''
下面是这学期要学习的课程
<a href='https://www.bilibili.com/video/av66771949/?p=l'target='blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是牛顿第2运动定律<a href='https://www.bilibili.com/video/av46349552/p=125'target='blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是毕达哥拉斯公式<a href='https://www.bilibili.com/video/av90571967/?p=33'target='blank'>点击这里,边看视频讲解,边学习以下内容</a>
这节讲的是切割磁力线
'''#替换函数,参数是 Match对象
def subfunc(match):#match对象的group(0)返回的是整个匹配上的字符串src=match.group(0)# Match对象的 group(1)返回的是第一个group分组的内容number=int(match.group (1))+6dest=f'/av{number}/'print(f'{av}替换为{dest}')#返回值就是最终替换的字符串return dest
newstr= re.sub(r'/av(\d+?)/', subfunc, names)
print(newStr)
贪婪的特殊字符,“*”,“+”,"?"
‘*’,’+’,’?'都是贪婪的,使用时会尽可能多的匹配内容
source='<html><head><title>Title</title>'
import re
p=re.compile(r'<.*>')
print(p)
结果是
['<html><head><title>Title</title>']
因为开头的<
和结尾的>
匹配上了。要向匹配所有的标签,就要使用非贪婪模式,也就是在星号后面加上?
,变成<.*?>
练习
匹配13或15开头的电话号码,1[35]\d{9}
匹配13、14、15、16开头的电话号码,1[3-6]\d{9}
python正则表达式入门相关推荐
- Python 正则表达式入门(初级篇)
唯心不易(转载) https://www.cnblogs.com/chuxiuhong/p/5885073.html Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门 ...
- python正则表达式入门_Python正则表达式教程之一:基础篇
前言 之前有人提了一个需求,我一看此需求用正则表达式最合适不过.考虑到之前每次使用正则表达式,都是临时抱佛脚,于是这次我就一边完成任务一边系统的学习了一遍正则表达式.主要参考PyCon2016上的一个 ...
- 【Python基础】Python正则表达式入门到入魔
关于正则表达式,很多人认为,使用的时候查询下就可以,没必要深入学习,但是知识与应用永远都是螺旋辩证的关系,有需要查询也无可厚非,但是先掌握知识,可以让应用更创新,更深入,超越他人,必须要先掌握大量的深 ...
- Python 正则表达式入门(详细)
什么是正则表达式 正则表达式是一组特殊的字符序列.是对字符串操作的一种逻辑公式,正则表达式通常被用来检索.替换那些符合某个模式的文本 比如检测一串数字是否符合电话号码.检测一个字符串是否符合email ...
- python正则表达式入门_Python中的正则表达式教程
本文http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html 正则表达式经常被用到,而自己总是记不全,转载一份完整的以备不时之需. 1. ...
- python正则表达式入门教程括号及字符
数据分析遇到字符串处理会有两个阶段涉及到正则表达式,一个是在数据库阶段一个是Python处理阶段.作为一个小白学习正则也遇到很多弯路和难理解的点,今天就梳理梳理学习的过程. hive里面正则表达式可以 ...
- python正则表达式入门_python入门_常见正则表达式匹配
made_in_miliLV的主页.png - 正则表达式:正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配.在开发的使用场景 - 例如:匹配url等等 本文中,对正则 ...
- python正则表达式入门视频_python正则表达式简介
作者 Toby,持牌照消费金融模型经理,发明国家算法专利,国内最大医药数据中心数据挖掘部门负责人!和重庆儿科医院,中科院教授,赛柏蓝保持慢病数据挖掘项目合作!清华大学,百度,腾讯,网易,爱奇艺等平台签 ...
- python正则表达式入门二
至少出现一次. 和*号的区别在于* 可以出现零次. + 示例 line = "tpyyyyyyypbpr123" regex_str = ".*?(p.+?p).*&qu ...
最新文章
- 28岁女博士生被骂“学术媛”,只因在网上分享自己牛津年级第一成绩毕业......
- aide怎么打开html文件,求助!aide获取网页html源码
- Maven提高篇系列之(五)——处理依赖冲突
- 【docker脚本收藏】docker-compose部署hadoop、spark等大数据各组件
- JavaScript基础5——关于ECMAscript的函数
- [转]OC与JS的交互详解
- Futter基础第21篇: 实现普通对话框、列表对话框、单选对话框、Toast提示
- Succinctly 中文系列教程(三)20220109 更新
- A8板卡AM3352移植环境搭建记录
- 压缩PPT文件的技巧
- GNU Radio Pythpn
- word2016 脚注问题总结
- 游戏里面的模型是怎么制作的?次世代场景建模有哪些特点?
- object-c中的对象的释放
- 联发科硕士工作4年待遇_重庆医科大学第三临床学院 2019年硕士研究生复试工作圆满结束...
- 一个处于发展过程中的企业,该如何进行精准获客?且不话大价钱。
- Haproxy[转载]
- 软件工程师面试及简历指南
- Swift编程十二(方法)
- 费纸箱手工制作机器人_废纸板制作机器人玩具,好玩还省钱!做亲子手工必学...