Python 正则模块详情


Posted in Python onNovember 02, 2021

Python中提供了操作正则表达式的模块,即re模块。

1、正则表达式的装饰符

修饰符 描述 完整名称
re.I 使匹配对大小写不敏感 re.IGNORECASE
re.A 让 \w, \W, \b, \B, \d, \D, \s 和 \S 只匹配ASCII,而不是Unicode re.ASCII
re.L 做本地化识别(locale-aware)匹配 re.LOCALE
re.M 多行匹配,影响 ^ 和 $,多行模式下是支持匹配行开头 re.MULTILINE
re.S 使 . 匹配包括换行在内的所有字符 e.DOTALL
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. re.UNICODE
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

2、查找单个匹配项

2.1 match

re.match 如果 string 开始的0或者多个字符匹配到了正则表达式样式,就返回一个相应的匹配对象 。 如果没有匹配,就返回 None ;注意它跟零长度匹配是不同的。

语法格式:

re.match(pattern, string, flags=0)

  • pattern:匹配的正则表达式
  • string:要匹配的字符串。
  • flags:标志位,用于控制正则表达式的匹配方式,

如:是否区分大小写,多行匹配等等。

匹配成功re.match方法返回一个匹配的对象,否则返回None。

示例代码:

"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/30
"""
import re
string1 = "hello python"
string2 = "hell5o python"
pattern = r"[a-z]+\s\w+"  # a-z出现1次到任意次加一个\s加任意字符出现1次到任意次
print(re.match(pattern, string1))  # <re.Match object; span=(0, 12), match='hello python'>
print(re.match(pattern, string2))  # None

开局导入re模块,r""表示为一个正则表达式

因为string2中间出现了一个数字5 所以不匹配

2.2 group

re.group是从Match对象中获取结果的,不过不分组默认为0,分组索引则从0开始(0是完整的一个匹配),如果多个分组,则第一个分组是1;也可以为其命名使用

示例代码:

"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/30
"""
import re
string1 = "hello python"
string2 = "hell5o python"
pattern = r"[a-z]+\s\w+"
pattern1 = r"(\w+)(\s)(\w+)"
pattern2 = r"(?P<first>\w+\s)(?P<last>\w+)"  # 命名分组
print(re.match(pattern, string1))  # <re.Match object; span=(0, 12), match='hello python'>
print(re.match(pattern, string1).group())  # hello python
print(re.match(pattern, string2))  # None
print(re.match(pattern1, string2).group(0))  # hell5o python
print(re.match(pattern1, string2).group(1))  # hell5o
print(re.match(pattern1, string2).group(2))  # 这里匹配的是那个空格
print(re.match(pattern1, string2).group(3))  # python
print(re.match(pattern2, string2).group("last"))  # python

2.3 search

re.search 扫描整个字符串找到匹配样式的第一个位置,并返回一个相应的匹配对象 。如果没有匹配,就返回一个 None ; 注意这和找到一个零长度匹配是不同的。语法结构和match是一样的

示例代码:

"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/30
"""
import re
string = "Hi World Hello python"
pattern = r"Hello python"
print(re.search(pattern, string).group())  # Hello python
print(re.match(pattern, string))  # None

两者的区别:

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None,而 re.search匹配整个字符串,直到找到一个匹配。

2.4 fullmatch

re.fullmatch如果整个 string 匹配这个正则表达式,就返回一个相应的匹配对象 。 否则就返回 None ; 注意跟零长度匹配是不同的。

语法格式跟上面的也是一样的

示例代码:

"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/30
"""
import re
string = "Hi World Hello python"
pattern = r"Hi World Hello python"
pattern1 = r"hi World hello python"

print(re.fullmatch(pattern, string))  # <re.Match object; span=(0, 21), match='Hi World Hello python'>
print(re.fullmatch(pattern1, string))  # None

三者的区别:

  • match:字符串开头匹配
  • search:查找任意位置的匹配项
  • fullmatch:整个字符串要与正则表达式完全匹配

2.5 匹配对象

匹配对象总是有一个布尔值 True。如果没有匹配的话match()search() 返回 None 所以可以简单的用 if 语句来判断是否匹配

示例代码:

import re
string = "Hi World Hello python"
pattern = r"Hello python"
match1 = re.search(pattern, string)
match2 = re.match(pattern, string)
if match1:
    print(match1.group())  # Hello python

if match2:  # 因为match2的值为none所以不执行
    print(match2.group())

3、查找多个匹配项

3.1 compile

re.compile将正则表达式的样式编译为一个正则对象,可以用于匹配

语法结构:

re.compile(pattern, flags=0)

  • pattern: 匹配的正则表达式
  • flags: 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

3.2 findall

re.findall在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。与match search 不同的是 match search 是匹配一次 findall 匹配所有。

语法结构:

re.findall(string[, pos[, endpos]])

  • string:待匹配的字符串。
  • pos:可选参数,指定字符串的起始位置,默认为 0。
  • endpos:可选参数,指定字符串的结束位置,默认为字符串的长度

3.3 finditer

pattern string 里所有的非重复匹配,返回为一个迭代器保存了匹配对象 。 *string*从左到右扫描,匹配按顺序排列。空匹配也包含在结果里。

语法结构同match

示例代码:

import re
from collections.abc import Iterator  # 导入判断是否为迭代器的对象
string = "hello python hi javascript"
pattern = r"\b\w+\b"
pattern_object = re.compile(r"\b\w+\b")
print(type(pattern_object))  # <class 're.Pattern'>

findall = pattern_object.findall(string)
for i in findall:
    print(i)

finditer = re.finditer(pattern, string)
# 判断是否为迭代器
print(isinstance(finditer, Iterator))  # True
for _ in range(4):
    finditer1 = finditer.__next__()  # 取出下一个值
    print(finditer1.group())
'''
--循环结果--
hello
python
hi
javascript
'''

如果有超大量的匹配项的话,返回finditer的性能要优于findall,这就是列表和迭代器的区别。

4、分割split

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

语法结构:

re.split(pattern, string[, maxsplit=0, flags=0])

  • pattern:匹配的正则表达式
  • string:分隔符。
  • maxsplit:分隔次数,maxsplit=1分隔一次,默认为 0,不限制次数。
  • flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

示例代码:

import re
string = '''hello hi    good morning
goodnight
python
javascript
Linux
'''
pattern = r'\s+'  # 以空格回车制表符为回车符
print(re.split(pattern, string))  # 不限制次数分隔
# ['hello', 'hi', 'good', 'morning', 'goodnight', 'python', 'javascript', 'Linux', '']
print(re.split(pattern, string, 5))  # 分隔5次
# ['hello', 'hi', 'good', 'morning', 'goodnight', 'python\njavascript\nLinux\n']

str模块的split不同的是,re模块的split支持正则

4.1 替换

4.1.1 sub

re.sub用于替换字符串中的匹配项

语法结构:

re.sub(pattern, repl, string, count=0, flags=0)

  • pattern : 正则中的模式字符串。
  • repl : 替换的字符串,也可为一个函数。
  • string : 要被查找替换的原始字符串。
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
  • flags : 编译时用的匹配模式,数字形式。

到这里就可以完成一个某手的评论区,修改不良评论的小案例

import re
string = input("请输入评论:")
pattern = r"[美丽可爱大方]{1}"  # 检测的字符
print(re.sub(pattern, "萌", string))

效果图:

Python 正则模块详情

Python 正则模块详情

4.1.2 subn

行为与 sub() 相同,但是返回一个元组 (字符串, 替换次数).

4.2 escape

re.escape(pattern)转义 pattern 中的特殊字符。例如正则里面的元字符.

示例代码:

import re
pattern = r'\w\s*\d\d.'
# 打印pattern的特殊字符
print(re.escape(pattern))  # \w\s*\d\d.

任意可能包含正则表达式元字符的文本字符串进行匹配,它就是有用的,不过容易出现错误,手动转义比较好

4.3 purge

re.purge()清除正则表达式的缓存。

到此这篇关于Python 正则模块详情的文章就介绍到这了,更多相关Python 正则模块内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
使用python实现拉钩网上的FizzBuzzWhizz问题示例
May 05 Python
深入理解Javascript中的this关键字
Mar 27 Python
基于python实现在excel中读取与生成随机数写入excel中
Jan 04 Python
mac安装scrapy并创建项目的实例讲解
Jun 13 Python
Python实现App自动签到领取积分功能
Sep 29 Python
详解多线程Django程序耗尽数据库连接的问题
Oct 08 Python
Python安装与基本数据类型教程详解
May 29 Python
pyqt5 使用label控件实时显示时间的实例
Jun 14 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
Apr 20 Python
pandas将list数据拆分成行或列的实现
Dec 13 Python
Python函数式编程中itertools模块详解
Sep 15 Python
Python 正则模块详情
Nov 02 Python
Python 数据可视化之Bokeh详解
Nov 02 #Python
Python 数据可视化之Matplotlib详解
分位数回归模型quantile regeression应用详解及示例教程
Python常遇到的错误和异常
Nov 02 #Python
Python 数据可视化之Seaborn详解
关于python中模块和重载的问题
pandas中对文本类型数据的处理小结
Nov 01 #Python
You might like
php cookies中删除的一般赋值方法
2011/05/07 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
2016/05/20 PHP
PHP邮箱验证示例教程
2016/06/01 PHP
PHP PDOStatement::setFetchMode讲解
2019/02/03 PHP
jquery select下拉框操作的一些说明
2010/04/02 Javascript
js函数调用常用方法详解
2012/12/03 Javascript
JS+flash实现chrome和ie浏览器下同时可以复制粘贴
2013/09/22 Javascript
jQuery源码分析之jQuery中的循环技巧详解
2014/09/06 Javascript
node.js中的path.dirname方法使用说明
2014/12/09 Javascript
jquery实现的省市区三级联动
2015/04/02 Javascript
Angular 理解module和injector,即依赖注入
2016/09/07 Javascript
JS实现数组去重方法总结(六种方法)
2017/07/14 Javascript
jQuery插件实现弹性运动完整示例
2018/07/07 jQuery
小程序跳转H5页面的方法步骤
2020/03/06 Javascript
[56:14]Fnatic vs OG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
2014/04/25 Python
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
python使用BeautifulSoup分析网页信息的方法
2015/04/04 Python
浅谈Python大神都是这样处理XML文件的
2019/05/31 Python
DC Shoes官网:美国滑板鞋和服饰品牌
2017/09/03 全球购物
Shopping happy life西班牙:以最优惠的价格提供最好的时尚配饰
2020/03/13 全球购物
新员工欢迎词
2014/01/12 职场文书
送餐员岗位职责范本
2014/02/21 职场文书
体育口号大全
2014/06/18 职场文书
电话客服专员岗位职责
2014/06/28 职场文书
尊老爱幼演讲稿
2014/09/04 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
推荐信范文大全
2015/03/27 职场文书
营运督导岗位职责
2015/04/10 职场文书
2015年秋学期师德师风建设工作总结
2015/10/23 职场文书
强烈推荐:小学生:暑假作息时间表(值得收藏)
2019/07/09 职场文书
公文写作:新员工转正申请书范本3篇!
2019/08/07 职场文书
创业计划书之情侣餐厅
2019/09/29 职场文书
如何用 Python 子进程关闭 Excel 自动化中的弹窗
2021/05/07 Python
pandas中DataFrame检测重复值的实现
2021/05/26 Python
总结一些Java常用的加密算法
2021/06/11 Java/Android