详解Python正则表达式re模块


Posted in Python onMarch 19, 2019

正则是处理字符串最常用的方法,我们编码中到处可见正则的身影。

正则大同小异,python 中的正则跟其他语言相比略有差异:

1、替换字符串时,替换的字符串可以是一个函数
2、split 函数可以指定分割次数,这会导致有个坑
3、前项界定的表达式必须定长

下面详细描述下 re 模块的使用方法,其实,注意上面提到的三点差异就好

1、match

说明:
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回 None。

语法:
re.match(pattern, string, flags=0)

flags为可选标识,多个标识可以通过按位或 (|) 来指定。如 re.I | re.M 被设置成 I 和 M 标识:

修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

匹配成功re.match方法返回一个匹配的对象,可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。group() 或 group(0),返回整个正则表达式的匹配结果。

举例:

s= 'abc123abc'

print(re.match('[a-z]+', s))



 # <_sre.SRE_Match object; span=(0, 3), match='abc'>

print(re.match('[a-z]+', s).group(0))


# abc
print(re.match('[\d]+', s))





# None
print(re.match('[A-Z]+', s, re.I).group(0))
 # abc
print(re.match('[a-z]+', s).span())


 # (0, 3)

2、search

说明:
re.search 扫描整个字符串并返回第一个成功的匹配。

语法:
re.search(pattern, string, flags=0)

匹配成功re.search方法返回一个匹配的对象,否则返回None。可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

s = 'abc123abc'

print(re.search('[a-z]+', s).group())# abc
print(re.search('[a-z]+', s).span())
 # (0, 3)
print(re.search('[\d]+', s).group())
 # 123
print(re.search('[\d]+', s).span())
 # (3, 6)
print(re.search('xyz', s))



 # None

groupdict
groupdict 返回匹配到的所有命名子组的字典。

print(re.search('[a-z]+', s).groupdict())   # {}

print(re.search('(?P<letter>[a-z]+)(?P<num>\d+)', s).groupdict()) # {'num': '123', 'letter': 'abc'}

3、sub 和 subn

说明:
re.sub用于替换字符串中的匹配项。

re.subn返回一个元组,包含替换后的字符串及替换次数。

语法:
sub(pattern, repl, string, count=0, flags=0)

repl: 替换的字符串,也可为一个函数。

count: 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

举例:

s = 'abc123abc'

print(re.sub('[\d]+', '数字', s))  # abc数字abc
print(re.sub('[a-z]+', '字母', s, 1)) # 字母123abc


# 将匹配的数字乘以 2
def double(matched):
 value = int(matched.group('value'))
 return str(value * 2)


# repl是一个函数
print(re.sub('(?P<value>\d+)', double, s))# abc246abc
print(re.subn('[\d]+', '数字', s))


 # ('abc数字abc', 1)
print(re.subn('[a-z]+', '字母', s,))


# ('字母123字母', 2)
print(re.subn('[a-z]+', '字母', s, 1))

 # ('字母123字母', 1)

4、compile

说明:
re.compile 用于编译正则表达式,生成一个正则表达式(Pattern)对象,供 match() 和 search() 这两个函数使用。

语法:
compile(pattern, flags=0)

举例:

s = 'abc123abc'

p = re.compile('[\d]+')

print(p.match(s, 4, 5).group(0)) # 2 从位置4开始匹配到位置5
print(p.search(s).group(0))   # 123

5、findall

说明:
re.findall 在字符串中查找正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

语法:
findall(pattern, string, flags=0)

举例:

s = 'abc123abc'

print(re.findall('[a-z]+', s)) # ['abc', 'abc']
print(re.findall('[h-n]+', s)) # []

6、finditer

说明:
finditer和 findall 类似,在字符串中查找正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

语法:
finditer(pattern, string, flags=0)

举例:

s = 'abc123def'

it = re.finditer('[a-z]+', s)

for match in it:
 print(match.group())

7、split

说明:
re.split 方法按照能够匹配的子串将字符串分割后返回列表。

语法:
split(pattern, string, maxsplit=0, flags=0)

maxsplit:分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。

举例:

print(re.split('a', '1A1a2A3', re.I))   # ['1A1', '2A3']

# 输出结果并未能区分大小写,这是因为re.split(pattern,string,maxsplit, flags)默认是四个参数,当我们传入的三个参数的时候,系统会默认re.I是第三个参数,所以就没起作用。
# 如果想让这里的re.I起作用,写成flags=re.I即可。
print(re.split('a', '1A1a2A3', flags=re.I))  # ['1', '1', '2', '3']

8、escape

说明:
re.escape对字符串里面的特殊字符串进行转义。

语法:
escape(pattern)

举例:

print(re.escape('www.dxy.cn')) # www\.dxy\.cn

9、正则

“(?P<name>…)”:分组,并将其命名为<name>。

“(?P=name)”:引用别名为<name>的分组匹配到的串。

10、前项(否定)界定中的特殊

正则中常用的前项界定(?<=exp)和前项否定界定(?<!exp)在 python 中会报错:look-behind requires fixed-width pattern,原因是 python 中前项界定的表达式必须是定长的,例如

(?<=aaa) # 正确

(?<=aaa|bbb) # 正确

(?<=aaa|bb) # 错误

(?<=\d+) 
# 错误

(?<=\d{3})  # 正确

以上所述是小编给大家介绍的Python正则表达式re模块详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python里disconnect UDP套接字的方法
Apr 23 Python
从请求到响应过程中django都做了哪些处理
Aug 01 Python
解决新django中的path不能使用正则表达式的问题
Dec 18 Python
如何使用Python自动控制windows桌面
Jul 11 Python
python-OpenCV 实现将数组转换成灰度图和彩图
Jan 09 Python
Django实现前台上传并显示图片功能
May 29 Python
python对一个数向上取整的实例方法
Jun 18 Python
python 制作python包,封装成可用模块教程
Jul 13 Python
python 生成正态分布数据,并绘图和解析
Dec 21 Python
python 如何上传包到pypi
Dec 24 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
Feb 22 Python
opencv实现图像几何变换
Mar 24 Python
python matplotlib画图库学习绘制常用的图
Mar 19 #Python
详解python的四种内置数据结构
Mar 19 #Python
python3使用matplotlib绘制条形图
Mar 25 #Python
python3使用matplotlib绘制散点图
Mar 19 #Python
浅谈PYTHON 关于文件的操作
Mar 19 #Python
python scatter散点图用循环分类法加图例
Mar 19 #Python
python使用matplotlib画柱状图、散点图
Mar 18 #Python
You might like
十天学会php(3)
2006/10/09 PHP
PHP中把对象数组转换成普通数组的方法
2015/07/10 PHP
PHP会话处理的10个函数
2015/08/11 PHP
利用php_imagick实现复古效果的方法
2016/10/18 PHP
PHP实现图片压缩
2020/09/09 PHP
jquery 弹出登录窗口实现代码
2009/12/24 Javascript
Confirmer JQuery确认对话框组件
2010/06/09 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
用jQuery获取IE9下拉框默认值问题探讨
2013/07/22 Javascript
模拟一个类似百度google的模糊搜索下拉列表
2014/04/15 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
2014/06/20 Javascript
原生js的RSA和AES加密解密算法
2016/10/08 Javascript
JS html时钟制作代码分享
2017/03/03 Javascript
关于javascript sort()排序你可能忽略的一点理解
2017/07/18 Javascript
NW.js 简介与使用方法
2018/02/01 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
angular2中使用第三方js库的实例
2018/02/26 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
2018/03/16 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
Vue页面跳转动画效果的实现方法
2018/09/23 Javascript
JavaScript实现图片放大镜效果
2019/06/27 Javascript
python交换两个变量的值方法
2019/01/12 Python
Python使用线程来接收串口数据的示例
2019/07/02 Python
python 解决Fatal error in launcher:错误问题
2020/05/21 Python
英国最受欢迎的价格比较网站之一:MoneySuperMarket
2018/12/19 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
初婚未育证明
2014/01/15 职场文书
三八妇女节活动主持词
2014/03/17 职场文书
祖国在我心中演讲稿300字
2014/05/04 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
运动会口号16字
2014/06/07 职场文书
地雷战观后感
2015/06/09 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python
go web 预防跨站脚本的实现方式
2021/06/11 Golang
带你了解Java中的ForkJoin
2022/04/28 Java/Android