![0a6104410e0811ed90debd32e1726ed7.png](https://i-blog.csdnimg.cn/blog_migrate/18271a2df638bbb2eeb514ef4ec9fb58.jpeg)
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。
re 模块使 Python 语言拥有全部的正则表达式功能。
本章节主要介绍Python中常用的正则表达式模式与实例。
1. 正则表达式模式
模式字符串使用特殊的语法来表示一个正则表达式:
字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。
多数字母和数字前加一个反斜杠时会拥有不同的含义。
标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
1.1 "^"
"^d" 代表的意思是以d元素开头的任意一个字符串,也就是说只要是以d开头的字符串,后面的元素不论是什么,都是符合规则的,总之必须要以d开头。
“.” 较为常用,其代表的意思是任意字符,其表示的范围非常广,可以接任意字符,不论是中英文,还是下划线之类的特殊字符,都是可以代表的。举个栗子,正则表达式“^d.”就是代表以d开头的字符串,b后边接任意字符都可以。
“*” 也十分常用,其代表的意思是前面的字符可以重复任意多遍,可以是0次,1次,2次等任意多次。
以下为第一个实例,匹配的正则表达式"^z.*" z开头的后面接任意多任意类型的字母数字字符
![df75266f4fa9dfb441c456a8930b1ae6.png](https://i-blog.csdnimg.cn/blog_migrate/8310dea9e0ee6d36b133a8ed8d54928d.jpeg)
如上图所示,该正则表达式能够顺利匹配得到string中某部分。
1.2 "$"
“$” 代表的意思是结尾字符。举个栗子,正则表达式“3$”,表示匹配以3为结尾的字符串。代码演示如下图所示。
看以下示例,很好理解,两个正则表达式分别匹配0结尾和2结尾的实例,结果当然匹配不到2结尾的字符串。因为string结尾是0。
![5c1474615a620cf871b450b114fb81d2.png](https://i-blog.csdnimg.cn/blog_migrate/8cde4000fef3df12e7a55effc3e69551.jpeg)
1.3 "?"
贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。
非贪婪匹配:就是匹配到结果就好。
首先看一个‘贪婪’的例子:
![2890b280eae2450a1a9756b0a5cfe63d.png](https://i-blog.csdnimg.cn/blog_migrate/9caa1521454616b3a20732f0fcb2697d.jpeg)
在这次贪婪模式的匹配下,匹配的是 "yes" and i say "no",因为默认为贪婪匹配,所以选取了最长的部分。
其次观察一下如果是‘非贪婪’的例子。
![2afb9b97af9fc52b211be748f350948c.png](https://i-blog.csdnimg.cn/blog_migrate/74435f4c21225416b7688e8f5b1b33e2.png)
显然,加入模式字符“?”之后,进入了非贪婪模式,而不会选取最长的那一段。
为了加深理解,再来看一个贪婪与非贪婪的实例。(d+表示单个以及多个数字)
![23e944e81a6bb110a9961fa4661527d1.png](https://i-blog.csdnimg.cn/blog_migrate/957eb954f1aff2e33f60ff11a7c2e7b8.jpeg)
看看这个贪婪例子,得到这个结果由于以下原因:
1.由于存在‘.*’则这一部分在贪婪模式下会在满足正则表达式的情况下让匹配的段最长
2. d+表示任意长度的数字组合(至少有一个数字)
所以为了满足1的贪婪条件,2的数字组合长度为1
而第二种情况下,在‘.’后加上‘?’使得前面这一段变的非贪婪(即匹配到满足条件的即可),所以当它们匹配到第一个数字1时,就结束‘.*’ 这一部分的匹配,开始‘d+’这一部分。
1.4 {}
“{}”实质上也是一个限定词的用法,其限定前面字符所出现的次数,其常用的模式有三种,分别是“{数字}”、“{数字,}”和“{数字1, 数字2}”。举个例子,如“{1}”、“{1,}”和“{1, 3}”。
1.形式A 限定{}前字符数量
如下图所示,.{2}指定了两个之间有2个字符,所以不会匹配只有一个中间字符的‘pcp’,而且根据贪婪匹配原则,会选取前面‘.*’最长的匹配结果所以选择的是‘pbap’而不是‘pabp’,‘pcpp’
![4ac505c2f28025483a47018ff004fec7.png](https://i-blog.csdnimg.cn/blog_migrate/14c332b2804e5862a05eaea1e973e397.jpeg)
2.形式B “{1,}”代表的是前面的字符出现1次及以上;特殊字符“{2,}”代表的是前面的字符出现2次及以上;特殊字符“{3,}”代表的是前面的字符出现3次及以上;以此类推。举个栗子,如下图所示。
![6e45a0e1b0f007e4f81e33f5aa00daf8.png](https://i-blog.csdnimg.cn/blog_migrate/6476884c6019c10981ad8f26e4d45281.jpeg)
3.形式C “{2, 3}” 代表的是前面的字符至少出现2次,最多出现3次;
![ce552feef8cd68e1a5f997a712450a10.png](https://i-blog.csdnimg.cn/blog_migrate/3c3fdb49af65b1c8616fb49b4f14ab8b.jpeg)
注意,这里采用了‘非贪婪’模式,所以出现第一个符合匹配正则表达式的部分之后,该p前面的部分将最短。
1.5 "|"
竖线“|”实质上是一个或的关系。并且当两个都满足时会优先匹配最前面的
![358b1581ef7411fbccc30303fed03e79.png](https://i-blog.csdnimg.cn/blog_migrate/cb2bd60c5aec3b6bedcab6771ac82a27.jpeg)
还能够使用这种多层的匹配
![56f25c276714d3bfdba21c71ad047866.png](https://i-blog.csdnimg.cn/blog_migrate/122266464e9b01b0608cc622246cac4a.jpeg)
为什么这里不是paa而是paap呢?因为match函数的规则。
![89975d05e09b75aac3919d2af28320c6.png](https://i-blog.csdnimg.cn/blog_migrate/7df19faee894406c81b6408d72c5a2cb.png)
也就是说re.match会从最左边开始匹配,并且要求必须在起始位置开始匹配。
那么这里的匹配可以理解为:paap14是在起始位置的,而paa14和起始位置paap14不符合(这里的起始不是指第一个,而是能从第一个字符向后匹配到某个字符,期间不断不少,个人理解)
1.6 "[]"
正则表达式特殊符号是“[]”。中括号十分实用,其有特殊含义,其代表的意思是中括号中的字符只要满足其中任意一个就可以。
A. 匹配模式为[abcd],在这里正则表达式代表的意思是字符串第一个字符是abcd四个字符中的任意一个。
![4ffedfcdc06dd7e99673ae134630f78a.png](https://i-blog.csdnimg.cn/blog_migrate/dca83aae339f551632d44991d2c8b248.jpeg)
B. [0-9]代表是的是0到9中任意一数字
![9711985930ac1309e3d365fc0befb861.png](https://i-blog.csdnimg.cn/blog_migrate/7a5217d55ebb09f0d918b9d74bb9cfdd.jpeg)
C. [a-z]代表26个英文小写字母;[A-Z]代表26个英文大写字母。
![339802e5dc2d7938bf84d28b874e2459.png](https://i-blog.csdnimg.cn/blog_migrate/f13244394d04191a376fa91fde599211.jpeg)
D. [^],在中括号中加入特殊字符“^”,表示非,取反的意思。举个栗子,“[^1]”的意思是字符不等于1。
![4147c5688e430a4a7048402dafcb2242.png](https://i-blog.csdnimg.cn/blog_migrate/21202fb5757e81ec8a45ebbe1b638d95.jpeg)
还有一些用法,以下就不一一实例了
![1e92f38a4879856e19dadd4943f4b55d.png](https://i-blog.csdnimg.cn/blog_migrate/c0d1f205f74e2cd570816e83e0137a9e.jpeg)
2.特殊字符类
2.1 “s”与“S”
“s”代表的意思是匹配空格
![ca2bc29ef88a3de9e8b57d3712177eba.png](https://i-blog.csdnimg.cn/blog_migrate/6a7f0f1a2cd30db842e53b384786ee26.jpeg)
s* 匹配多个空格
![b2aca7954eea8f7c70609feb2685a0c2.png](https://i-blog.csdnimg.cn/blog_migrate/94667432ee0a09f57401a253d52fc2fe.jpeg)
“S”代表的意思与“s”代表的意思刚刚相反,也就是说匹配的那个字符只要不是空格,都可以匹配。
![b2668bff36eb4205b7d22a90d24e0010.png](https://i-blog.csdnimg.cn/blog_migrate/a8d40d88a85d3364de5c166593628fad.jpeg)
2.2 [u4E00-u9FA5]
[u4E00-u9FA5]特殊字符是固定的写法,其代表的意思是汉字。换句话说,只要字符中是汉字,就可以通过该字符进行匹配,该特殊字符也是用中括号括起来的。
![5e9f8b5ec03c27f7a74aba5660bd2fa8.png](https://i-blog.csdnimg.cn/blog_migrate/299feb41e15f30b4baa088b27508282e.jpeg)
2.3 "w"与"W"
“w”代表的意思是该字符为任意字符,但是和特殊字符“.”的意思不同。
“w”代表的字符主要包括26个大写字母A到Z,即[A-Z]、26个小写字母a到z,即[a-z]、10个阿拉伯数字0到9,即[0-9]和下划线“_”。总结起来就是,“w”代表的意思是[A-Za-z0-9_]中任意一个字符。
![7aca712d80e37f4b96fd3db8818e325b.png](https://i-blog.csdnimg.cn/blog_migrate/4cdff2772a6a67a1db257ee759eed567.jpeg)
“W”代表的意思与“w”刚刚相反,也就是匹配除了[A-Za-z0-9_]之外的其他字符。接上一步的例子,此时将“w”改为“W”。
![39fa5acd095cba1b2f9f7c321280f035.png](https://i-blog.csdnimg.cn/blog_migrate/88a4535c1030bc250e4720e0816751d5.jpeg)
对比:“.” 代表的意思是任意字符,其范围比“w”代表的意思要广。
3. 简单应用
用以上所学的正则表达式字符和模式实现一个简单的应用。
import
以下就是今天所“查漏补缺”的正则表达式,目前还只是最基础的应用,下次会详细写python正则表达式的处理函数。