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 相关文章推荐
详解Django框架中用户的登录和退出的实现
Jul 23 Python
python运行其他程序的实现方法
Jul 14 Python
Python文本特征抽取与向量化算法学习
Dec 22 Python
Python 实现淘宝秒杀的示例代码
Jan 02 Python
使用EduBlock轻松学习Python编程
Oct 08 Python
PyGame贪吃蛇的实现代码示例
Nov 21 Python
Python定时任务APScheduler的实例实例详解
Jul 22 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
Feb 03 Python
Python Django中的STATIC_URL 设置和使用方式
Mar 27 Python
keras 使用Lambda 快速新建层 添加多个参数操作
Jun 10 Python
使用python爬取抖音app视频的实例代码
Dec 01 Python
python 实现百度网盘非会员上传超过500个文件的方法
Jan 07 Python
Python 数据可视化之Bokeh详解
Nov 02 #Python
Python 数据可视化之Matplotlib详解
分位数回归模型quantile regeression应用详解及示例教程
Python常遇到的错误和异常
Nov 02 #Python
Python 数据可视化之Seaborn详解
关于python中模块和重载的问题
pandas中对文本类型数据的处理小结
Nov 01 #Python
You might like
一个图形显示IP的PHP程序代码
2007/10/19 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
2017/02/24 PHP
Laravel框架Auth用户认证操作实例分析
2019/09/29 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
JavaScript的parseInt 取整使用
2011/05/09 Javascript
仿百度输入框智能提示的js代码
2013/08/22 Javascript
jQuery中filter()和find()的区别深入了解
2013/09/25 Javascript
简单的邮箱登陆的提示效果类似于yahoo邮箱
2014/02/26 Javascript
javascript实现简单的贪吃蛇游戏
2015/03/31 Javascript
javascript删除数组重复元素的方法汇总
2015/06/24 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
js 求时间差的实现代码
2016/04/26 Javascript
jQuery获取this当前对象子元素对象的方法
2016/11/29 Javascript
node.js中debug模块的简单介绍与使用
2017/04/25 Javascript
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
2017/06/13 jQuery
AngularJS实现的select二级联动下拉菜单功能示例
2017/10/25 Javascript
浅谈es6 javascript的map数据结构
2017/12/14 Javascript
详解使用vuex进行菜单管理
2017/12/21 Javascript
微信小程序rich-text富文本用法实例分析
2019/05/20 Javascript
javascript实现画板功能
2020/04/12 Javascript
详解Python中内置的NotImplemented类型的用法
2015/03/31 Python
在Python中使用__slots__方法的详细教程
2015/04/28 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
python数据结构之链表详解
2017/09/12 Python
R语言 vs Python对比:数据分析哪家强?
2017/11/17 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
2020/04/17 Python
柯基袜:Corgi Socks
2017/01/26 全球购物
澳大利亚在线消费电子产品商店:TobyDeals
2020/01/05 全球购物
医务人员自我评价
2014/01/26 职场文书
水果超市创业计划书
2014/01/27 职场文书
教师四风自我剖析材料
2014/09/30 职场文书
公证处委托书
2015/01/28 职场文书
销售工作决心书
2015/02/04 职场文书
纪录片信仰观后感
2015/06/08 职场文书
学籍证明模板
2015/06/18 职场文书
python基于机器学习预测股票交易信号
2021/05/25 Python