python3RE正则(正则表达式)
⼀、正则表达式
1.正则表达式概述
正则表达式,⼜称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的⼀个概念。正则表达式通常被⽤来检索、替换那些符合某个模式(规则)的⽂本。正则表达式(Regular Expression)是⼀种⽂本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。正则表达式使⽤单个字符串来描述、匹配⼀系列匹配某个句法规则的字符串。正则表达式是烦琐的,但它是强⼤的,学会之后的应⽤会让你除了提⾼效率外,会给你带来绝对的成就感。
2.表达式列表
表达
式
说明
字符匹配[0-9]匹配0-9之间的任意1个数字。
[a-z]表⽰某个范围内的字符。与指定区间内的任何字符匹配。例如,"[a-z]"匹配"a"与"z"之间的任何1个⼩写字母。[A-Z]表⽰某个范围内的字符。与指定区间内的任何字符匹配。例如,"[A-Z]"匹配"A"与"Z"之间的任何1个⼤写字母。
元字符匹
配.匹配换⾏符以外的任何字符。
\w与任何单词字符匹配,包括下划线。等价于"[A-Za-z0-9_]"。
\s与任何⽩字符匹配,包括空格、制表符、分页符等。等价于"[\f\n\r\t\v]"。
\d与⼀个数字字符匹配。等价于[0-9]。
\n与换⾏符字符匹配。
\t与制表符匹配。
\b与单词的边界匹配,即单词与空格之间的位置。例如,"er\b"与"never"中的"er"匹配,但是不匹配"verb"中的"er"。
^匹配输⼊的开始位置。
$匹配输⼊的结尾。
\W与任何⾮单词字符匹配。等价于"[^A-Za-z0-9_]"。
\D与⾮数字的字符匹配。等价于[^0-9]。
\S与任何⾮空⽩的字符匹配。等价于"[^\f\n\r\t\v]"。
x|y匹配x或y。例如"z|food"可匹配"z"或"food"。"(z|f)ood"匹配"zood"或"food"。
()组,与模式匹配并记住匹配。匹配的⼦字符串可以从作为结果的Matches集合中使⽤Item[0]... [n]取得。如果要匹配括号字符(和),可使⽤"\("或"\)"。
[xyz]⼀个字符集。与括号中字符的其中之⼀匹配。例如,"[abc]"匹配"plain"中的"a"。
[^xyz]⼀个否定的字符集。匹配不在此括号中的任何字符。例如,"[^abc]"可以匹配"plain"中的"pl".
*匹配前⼀个字符零次或⼏次。例如,"zo*"可以匹配"z"、"zoo"。
+匹配前⼀个字符⼀次或多次。例如,"zo+"可以匹配"zoo",但不匹配"z"。
量词
匹配前⼀个字符零次或⼀次。例如,"a?ve?"可以匹配"never"中的"ve"。
{n}n为⾮负的整数。匹配恰好n次。例如,"o{2}"不能与"Bob中的"o"匹配,但是可以与"foooood"中的前两个o匹配。{n,}
n为⾮负的整数。匹配⾄少n次。例如,"o{2,}"不匹配"Bob"中的"o",但是匹配"foooood"中所有的o。"o{1,}"等价于"o+"。
"o{0,}"等价于"o*"。
{n,m}m和n为⾮负的整数。匹配⾄少n次,⾄多m次。例如,"o{1,3}"匹配"fooooood"中前三个o。"o{0,1}"等价于"o?"。
3.表达式的应⽤区别(1).^${}的区别
python正则表达式不包含正则待匹配字符匹配
结果
说明
李.?李杰和李莲英和李⼆棍⼦李杰
李莲
李⼆
表⽰重复零次或⼀次,即只匹配"李"后⾯⼀个任意字符
李.*李杰和李莲英和李⼆棍⼦李杰和李莲英和李⼆棍⼦*表⽰重复零次或多次,即匹配"李"后⾯0或多个任意字符
李.+李杰和李莲英和李⼆棍⼦李杰和李莲英和李⼆棍⼦+表⽰重复⼀次或多次,即只匹配"李"后⾯1个或多个任意字符
李.{1,2}李杰和李莲英和李⼆棍⼦李杰和
李莲英
李⼆棍
{1,2}匹配1到2次任意字符
注意:前⾯的*,+,?等都是贪婪匹配,也就是尽可能匹配,在⼀个量词后⾯加?号使其变成惰性匹配
正则待匹配字符匹配
结果
说明
李.*?李杰和李莲英和李⼆棍⼦李
李
李
惰性匹配
(2)字符集[ ] [ ^ ]
正则待匹配字符匹配
结果
说明
李[杰莲英⼆棍⼦]*李杰和李莲英和李⼆棍⼦李杰
李莲英
李⼆棍⼦
表⽰匹配"李"字后⾯[杰莲英⼆棍⼦]的字符任意次
李[^和]*李杰和李莲英和李⼆棍⼦李杰
李莲英
李⼆棍⼦
表⽰匹配⼀个不是"和"的字符任意次
[\d]456bdha34
5
6
3
表⽰匹配任意⼀个数字,匹配到4个结果
[\d]+456bdha3456
3表⽰匹配任意个数字,匹配到2个结果
(3)转移符\
在正则表达式中,有很多有特殊意义的是元字符,⽐如\d和\s等,如果要在正则中匹配正常的"\d"⽽不是"数字"就需要对"\"进⾏转义,变成'\\'。
在python中,⽆论是正则表达式,还是待匹配的内容,都是以字符串的形式出现的,在字符串中\也有特殊的含义,本⾝还需要转义。所以如果匹配⼀次"\d",字符串中要写成'\\d',那么正则⾥就要写成"\\\\d",这样就太⿇烦了。这个时候我们就⽤到了r'\d'这个概念,此时的正则是r'\\d'就可以了。
正则待匹配字符匹配
结果
说明
\d\d False因为在正则表达式中\是有特殊意义的字符,所以要匹配\d本⾝,⽤表达式\d⽆法匹配\\d\d True
转义\之后变成\\,即可匹配
如果在python中,字符串中的'\'也需要转义,所以每⼀个字符串'\'⼜需要转义⼀次
"\\\\d"'\\d' True如果在python中,字符串中的'\'也需要转义,所以每⼀个字符串'\'⼜需要转义⼀次r'\\d'r'\d' True在字符串之前加r,让整个字符串不转义
(4)贪婪匹配
贪婪匹配:在满⾜匹配时,匹配尽可能长的字符串,默认情况下,采⽤贪婪匹配。
正则待匹配字符匹配
结果
说明
<.*><script>...<script><script>...<script>默认为贪婪匹配模式,会匹配尽量长的字符串
<.*?>r'\d'<script>
<script>
加上?为将贪婪匹配模式转为⾮贪婪匹配模式,会匹配尽量短的字符串⼏个常⽤的⾮贪婪匹配模式
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
.
*?的⽤法
. 是任意字符
* 是取 0 ⾄⽆限长度
是⾮贪婪模式。
何在⼀起就是取尽量少的任意字符,⼀般不会这么单独写,他⼤多⽤在:
.*?x
就是取前⾯任意长度的字符,直到⼀个x出现
⼆、RE模块
<函数⽅法总结
⽅法名称 格式
说明
findall re.findall(表达式,字符串)返回所有满⾜匹配条件的结果,放在列表⾥
search re.search(表达式,字符
串).groups()
函数会在字符串内查模式匹配,只到到第⼀个匹配然后返回⼀个包含匹配信息的对象,该对象可以
通过调⽤group()⽅法得到匹配的字符串,如果字符串没有匹配,则返回None。
match re.match(表达式,字符
串).groups()
同search,不过尽在字符串开始处进⾏匹配
split re.split(表达式,字符串)按表达式对字符串分割,返回列表
sub re.sub(表达式,替换字符,字符
串,count)
按表达式类型替换成新的字符,返回字符串
subn re.subn(表达式,替换字符,字符
串,count)
按表达式类型替换成新的字符串,返回⼀个元组,存放这替换结果和替换次数
compile repile(表达式)将正则表达式编译成为⼀个正则表达式对象finditer re.finditer(表达式,字符串)finditer返回⼀个存放匹配结果的迭代器
2.常⽤⽅法实例
#(1)findall
import re
ret = re.findall('\d','adsf123456we7we') #匹配字符串中是数字的字符,并将匹配值返回到列表中print(ret)
'''结果:
['1', '2', '3', '4', '5', '6', '7']
'''
#(2)search
ret = re.search('\d','adsf123456we7we').group() #按照表达式匹配到第⼀个值就返回
print(ret)
'''结果:
1
'''
#(3)match
ret = re.match('\w','adsf123456we7we').group() #按照表达式匹配开头第⼀个值,符合的话就返回,不符合就报错
print(ret)
'''结果:
a
'''
#(4)sub
ret = re.sub('\d','*','adsf123456we7we',0) #匹配字符串中的数字,并且替换成*号,0表⽰替换所有
print(ret)
'''结果:
adsf******we*we
'''
#(5)subn
ret = re.subn('\d','*','adsf123456we7we',0) #匹配字符串中的数字,并且替换成*号,返回⼀个元组,存放这替换结果和替换次数print(ret)
'''结果:
('adsf******we*we', 7)
'''
#(6)compile
obj = repile('\d') #将正则表达式编译成⼀个正则表达式对象
ret = obj.search('ads123asd456').group()
print(ret)
'''结果:
1
'''
#(7)finditer
ret = re.finditer('\d','adsf451we15615adf16') #finditer返回⼀个存放匹配结果的迭代器
print(ret)
for i in ret:
up())
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论