详解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代码使其加快作用域内的查找
Mar 30 Python
python3+PyQt5实现柱状图
Apr 24 Python
python实现简单淘宝秒杀功能
May 03 Python
python中单下划线_的常见用法总结
Jul 10 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
Aug 13 Python
详解Python 中sys.stdin.readline()的用法
Sep 12 Python
Python小程序 控制鼠标循环点击代码实例
Oct 08 Python
详解Python在使用JSON时需要注意的编码问题
Dec 06 Python
python 3.8.3 安装配置图文教程
May 21 Python
Python Socket多线程并发原理及实现
Dec 11 Python
Python道路车道线检测的实现
Jun 27 Python
python神经网络ResNet50模型
May 06 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的基本常识小结
2013/07/05 PHP
Thinkphp实现站点静态化的方法详解
2017/03/21 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
2017/06/11 PHP
laravel获取不到session的三种解决办法【推荐】
2018/09/16 PHP
jQuery lazyload 的重复加载错误以及修复方法
2010/11/19 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
Jquery 动态循环输出表格具体方法
2013/11/23 Javascript
在线一元二次方程计算器实例(方程计算器在线计算)
2013/12/22 Javascript
javascript实现一个数值加法函数
2015/06/26 Javascript
js实现具有高亮显示效果的多级菜单代码
2015/09/01 Javascript
JavaScript中的对象继承关系
2016/08/01 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
JS 验证密码 不能为空,必须含有数字、字母、特殊字符,长度在8-12位
2017/06/21 Javascript
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
快速将Vue项目升级到webpack3的方法步骤
2017/09/14 Javascript
Bootstrap导航菜单点击后无法自动添加active的处理方法
2018/08/10 Javascript
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
Vue3 中的数据侦测的实现
2019/10/09 Javascript
javascript实现简易的计算器
2020/01/17 Javascript
小程序实现背景音乐播放和暂停
2020/06/19 Javascript
使用JS实现鼠标放上图片进行放大离开实现缩小功能
2021/01/27 Javascript
js实现Element中input组件的部分功能并封装成组件(实例代码)
2021/03/02 Javascript
[06:04]DOTA2国际邀请赛纪录片:Just For LGD
2013/08/11 DOTA
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
python打开url并按指定块读取网页内容的方法
2015/04/29 Python
Python切片工具pillow用法示例
2018/03/30 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
2019/10/24 Python
python读取hdfs并返回dataframe教程
2020/06/05 Python
canvas绘制圆角头像的实现方法
2019/01/17 HTML / CSS
韩国爱茉莉太平洋化妆品美国站:Amore Pacific US
2016/10/28 全球购物
联想加拿大官方网站:Lenovo Canada
2018/04/05 全球购物
信息合作协议书
2014/10/09 职场文书
2014年预算员工作总结
2014/12/05 职场文书
女方家长婚礼致辞
2015/07/27 职场文书
大学班长竞选稿
2015/11/20 职场文书
Li list-style-image 图片垂直居中实现方法
2023/05/21 HTML / CSS