详解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程序设计入门(5)类的使用简介
Jun 16 Python
Python pass详细介绍及实例代码
Nov 24 Python
python中redis的安装和使用
Dec 04 Python
Laravel框架表单验证格式化输出的方法
Sep 25 Python
python从zip中删除指定后缀文件(推荐)
Dec 05 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
Jan 18 Python
AUC计算方法与Python实现代码
Feb 28 Python
Tensorflow之梯度裁剪的实现示例
Mar 08 Python
解决pycharm中的run和debug失效无法点击运行
Jun 09 Python
pycharm中leetcode插件使用图文详解
Dec 07 Python
Python基于Tkinter开发一个爬取B站直播弹幕的工具
May 06 Python
Python使用DFA算法过滤内容敏感词
Apr 22 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+APACHE实现用户论证的方法
2006/10/09 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
通过PHP实现获取访问用户IP
2020/05/09 PHP
PHP基于ip2long实现IP转换整形
2020/12/11 PHP
JavaScript中使用构造器创建对象无需new的情况说明
2012/03/01 Javascript
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
基于jQuery实现仿淘宝套餐选择插件
2015/03/04 Javascript
jQuery关键词说明插件cluetip使用指南
2015/04/21 Javascript
jquery实现经典的淡入淡出选项卡效果代码
2015/09/22 Javascript
不依赖Flash和任何JS库实现文本复制与剪切附源码下载
2015/10/09 Javascript
理解javascript异步编程
2016/01/27 Javascript
Nodejs中session的简单使用及通过session实现身份验证的方法
2016/02/04 NodeJs
浅析javascript函数表达式
2016/02/10 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
2016/12/26 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
微信小程序的tab选项卡的实现效果
2019/05/15 Javascript
jQuery/JS监听input输入框值变化实例
2019/10/17 jQuery
Python中使用glob和rmtree删除目录子目录及所有文件的例子
2014/11/21 Python
Python 爬虫多线程详解及实例代码
2016/10/08 Python
python自动裁剪图像代码分享
2017/11/25 Python
pygame游戏之旅 创建游戏窗口界面
2018/11/20 Python
Python爬取知乎图片代码实现解析
2019/09/17 Python
Python 中的 import 机制之实现远程导入模块
2019/10/29 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
2020/03/23 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
美国在线咖啡、茶和餐厅供应商:LollicupStore
2018/05/04 全球购物
Woods官网:加拿大最古老、最受尊敬的户外品牌之一
2020/09/12 全球购物
JSF的标签库有哪些
2012/04/27 面试题
高级人员简历的自我评价分享
2013/11/03 职场文书
大学生入党推荐书范文
2014/05/17 职场文书
反腐倡廉标语
2014/06/24 职场文书
css 中多种边框的实现小窍门
2021/04/07 HTML / CSS
JavaScript实现简单拖拽效果
2021/09/15 Javascript
十大最强奥特曼武器:怪兽战斗仪在榜,第五奥特之父只使用过一次
2022/03/18 日漫
使用 CSS 构建强大且酷炫的粒子动画效果
2022/08/14 HTML / CSS