Python实用技术一:正则表达式

简介: 用以表示“此处必须出现一个某某范围内的字符”,或者“此处必须出现一一个字符,但不可以是某某范围内的字符” ,但不可以十某某范围内的字符。

这一章主要讲一讲Python学习中比较深层次的内容,需要大家更加认真的学习。


一,正则表达式的基本概念和构成


正则表达式是个某些字符有特殊含义字符串,表示一种字符串的模式(格式),

如:


ff2ddf36b4124310972ad99a2e014b92.png


可以用相关函数求给定字符串和正则表达式的匹配情况


160cbe6846f84cef834fdeb6a93efeb8.png

aba4f1dae6f749a28c2b131744692ec2.png


二,正则表达式中的特殊字符


正则表达式中常见的特殊字符有以下几个:


cfadea1312684e568dd365fd8154cb5a.png


如果要在正则表达式中表示这几个字符本身,就应该在其前面

加    \


c4381edfdbcc4c52a1bc2a2af252f776.png


三,字符范围和量词


用以表示“此处必须出现一个某某范围内的字符”,或者“此处必须出现一一个字符,但不可以是某某范围内的字符” ,但不可以十某某范围内的字符。


6cb6d70609694eb8a4bc0c761d8511db.png


汉字的unicode编码范围是4e00- 9fa5(16进制)因此[ \u4e00-\u9fa5]即表示一个汉字。


量词的用法:


cc8f9ebcb32f4abebe6b55f3ddef42be.png


正则表达式的例子:


c31ecc54cd854a9da4c42e724896f141.png


四,正则表达式的函数


1,re.match函数


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


●从字符串str ing的起始位置匹配一一个模式pattern

●flags标志位, 用于控制模式串的匹配方式,如:是否区分大小写,多行匹配等等,如re.M| re. |表示忽略大小写, 且多行匹配

●成功则返回一个匹配对象,否则返回None


c63901abf29546779be4aae7a6534854.png


bffe8447b8b24ac797b2ca800d452916.png

a69122b343134a018a0f17fbc6613aec.png

09647057f73d4ac1968dd9d85d063280.png


2,re.search函数


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


查找字符串中可以匹配成功的子串。

若匹配成功,则返回匹配对象;若无法匹配,则返回None。


c0a36e585d2f49958b20b494fc1d4d4c.png


输出字串及起止位置。



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


查找字符串中所有和模式匹配的子串(不重叠)放入列表。一个子串都找不到就返回空表[]。


4,re.finditer函数


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


查找字符串中所有和模式匹配的子串(不重叠),每个子串对应于一个匹配对象,返回匹配对象的序列(准确说是“可调用迭代器”)


ee6a7a8ba6ec45d490a8716a5016e56d.png


5,re.sub函数


re. sub (模式串,替换串,母串) 用于替换匹配的子串


4ff0d1fb7d1f449abf69a0bb32ba4db5.png


五,边界符号


\A        表示字符串的左边界,即要求从此往左边不能有任何字符

\Z        表示字符串的右边界,即要求从此往右边不能有任何字符

^        与\A同。但多行匹配模式下还可以表示一行文字的左边界

$        与\Z同。但多行匹配模式下还可以表示一行文字的右边界


边界符号本身不会和任何字符匹配。

Python字符串"A', \Z'都是两个字符,而不是像"\n'那样的一个字符。


\b        表示此处应为单词的左边界或右边界,即不可是单词字符

\B        表示此处不允许是单词的左边界或右边界,即必须是单词字符


正则表达式的边界符号"b'是两个字符。但是在Python字符串中,'\b'和"\t,'n'类似,是一个字符(Backspace)。 因此在正则表达式中使用边界符号\b,要写"\b'。如果写'\\b', 则连续的两个"\被看作是一个普通的" \ “, 不会和后面的'b'一起被当作字符组合,变成边界符号'\b'。


print("\\b")         #>>\b


六,分组


1,括号中的表达式是一个分组。多个分组按左括号从左到右从1开始依次编号


f12db36ca14e4a4790c9b15e2dec5959.png


2, 在分组的右边可以通过分组的编号引用该分组所匹配的子串


29c31121f11c49389dc03a51c7437d7a.png

8ec5394bb2ef45f79eeffd33addbece2.png


3,分组作为一个整体,后面可以跟量词


85db4c1460924b2791b943d97bb40cba.png


不要求分组的多次出现必须匹配相同字符串


4,re.findall和分组


1)在正则表达式中没有分组时,re. findall返回所有匹配子串构成的列表。有且只有一一个分组时,re. finda11返回的是- -个子串的列表,每个元素是一个匹配子串中分组对应的内容。


644782743ab84edbaa4e76c3b69e7825.png


2)在正则表达式中有超过一个分组时,re . findall返回的是一个元组的列表,每个元组对应于一-个匹配的子串,元组里的元素,依次是1号分组、2号分组、3号分组......匹配的内容


4efac1978e7a480f88d78b643d11f815.png


七,‘ | ’的用法


1,表示“或”,如果没有放在" () "中,则起作用范围是直到整个正则表达式开头或结尾或另一个” | “


2c6cdfdcb384425f8f7c8005ad577e02.png


2,从左到右短路匹配(匹配上一个后就不计算是否还能匹配后面的)


b8d81584f8344afcb08c071a6012c45a.png


3,' | ‘也可以用于分组中,起作用范围仅限于分组内


f67be2fdd6d744528fec0cce35cafb2e.png


八,贪婪模式和懒惰模式


1,贪婪模式:


量词+,*,?, {m,n}默认匹配尽可能长的子串


7c59382a634b41359b75c5b6bf7f6ada.png


2,非贪婪(懒惰)模式:


在量词+,*,?, {m,n}后面加"?'则匹配尽可能短的字符串。


00f7d7b43bcc4a89ae488355d88dd76a.png

96f70bcd7d124ad6bb1168530c3bb187.png


九,匹配对象


groups([default]):

以元组形式返回全部分组匹配的字符串。相当于调用group(1 ,2,.. .last)。

default表示没有匹配字符串的组以这个值替代,默认为None。


groupdict([default]): .

返回以有名字的组的名字为键、以该组匹配的子串为值的字典,没有

名字的组不包含在内。default含义同上。


start([group]):

返回指定的组匹配的子串在string中的起始位置。group默认值 为0。


end([group]):

返回指定的组匹配的子串在string中的结束位置(子串最后一个字符的

位置+1)。group默认值为0。


span([group]):

返回(start(group), end(group))。

group可以是组编号,也可以是组名字,缺省为0


一般来说,要写一个精确的正则表达式是很困难的,所以我们可以讲正则表达式写的宽容一些,即,匹配到的不一定是正确的,但是正确的一定可以匹配到。

目录
相关文章
|
20天前
|
缓存 NoSQL Redis
Python缓存技术(Memcached、Redis)面试题解析
【4月更文挑战第18天】本文探讨了Python面试中关于Memcached和Redis的常见问题,包括两者的基础概念、特性对比、客户端使用、缓存策略及应用场景。同时,文章指出了易错点,如数据不一致和缓存淘汰策略,并提供了实战代码示例,帮助读者掌握这两款内存键值存储系统的使用和优化技巧。通过理解其核心特性和避免常见错误,可以提升在面试中的表现。
26 2
|
4天前
|
Python
Python中赋值使地址一样的技术探究
Python中赋值使地址一样的技术探究
18 0
|
4天前
|
算法 Python
Python中不使用sort对列表排序的技术
Python中不使用sort对列表排序的技术
16 1
|
4天前
|
数据采集 编解码 数据挖掘
使用Python进行多次降采样技术
使用Python进行多次降采样技术
9 1
|
4天前
|
数据可视化 Python
Python中的等值线平滑处理技术
Python中的等值线平滑处理技术
12 2
|
10天前
|
机器学习/深度学习 算法 前端开发
【Python机器学习专栏】机器学习中的模型融合技术
【4月更文挑战第30天】模型融合,即集成学习,通过结合多个模型提升预测性能。常见方法包括:Bagging(如Random Forest)、Boosting(如AdaBoost、XGBoost)和Stacking。Python中可使用`scikit-learn`实现,例如BaggingClassifier示例。模型融合是机器学习中的强大工具,能提高整体性能并适应复杂问题。
|
10天前
|
机器学习/深度学习 算法 Python
【Python机器学习专栏】机器学习中的超参数调优技术
【4月更文挑战第30天】本文探讨了机器学习中超参数调优的重要性,介绍了网格搜索、随机搜索、贝叶斯优化和AutoML等调优方法,并提供了Python中使用`scikit-learn`进行网格搜索的示例。超参数的选择直接影响模型学习和泛化能力,而调优技术能帮助找到最佳组合,提升模型性能。随着AutoML的发展,自动化调参将成为更高效的选择。
|
10天前
|
机器学习/深度学习 算法 算法框架/工具
【Python机器学习专栏】深度学习中的正则化与优化技术
【4月更文挑战第30天】本文探讨了深度学习中的正则化和优化技术,以提升模型的泛化能力和训练效率。正则化包括L1和L2正则化以及Dropout,防止过拟合。优化技术涵盖梯度下降法、动量法和Adam优化器,加速模型收敛。Python示例展示了如何在Keras中应用这些技术,如L2正则化、Dropout及Adam优化器。
|
10天前
|
机器学习/深度学习 数据采集 算法
【Python机器学习专栏】数据标准化与归一化技术
【4月更文挑战第30天】在机器学习中,数据预处理的两大关键步骤是标准化和归一化,旨在调整数据范围以优化算法性能。标准化将数据缩放到特定区间,如[-1, 1]或[0, 1],适合基于距离的算法,如KNN、SVM。归一化则将数据线性变换到[0, 1],保持相对关系。Python中可使用`sklearn.preprocessing`的`MinMaxScaler`和`StandardScaler`实现这两种操作。选择哪种方法取决于数据分布和算法需求。预处理能提升模型理解和性能,增强预测准确性和可靠性。
|
10天前
|
机器学习/深度学习 算法 Python
【Python机器学习专栏】数据特征选择与降维技术
【4月更文挑战第30天】本文探讨了Python中数据特征选择与降维技术在机器学习和数据分析中的应用。特征选择包括单变量选择、递归特征消除(RFE)、树模型的特征重要性和相关性分析,有助于去除冗余和无关特征。降维技术涵盖PCA、LDA以及非线性方法如KPCA和ISOMAP,用于在低维空间保留信息。这些技术能简化数据、提升模型性能及可解释性。