正则表达式
Posted yttbk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式相关的知识,希望对你有一定的参考价值。
正则表达式(或re)是一种小型的、高度专业化的编程语言,(在python中)它内嵌在python中,并通过re模块来实现。那么在什么情况下会用到正则表达式呢,如下:
--可以为想要匹配的相应字符串集指定规则
--该字符串集可能包含英文语句、e-mail地址,命令或任何你想搞定的东西
--可以问诸如“这个字符串匹配该模式吗”,“在这个字符串中是否有部分匹配该模式呢”
--你也可以使用re以各种方式来修改或分割字符串
正则表达式模式被编译成一系列的字节码,然后由C编写的匹配引擎执行。且正则表达式语言相对小型和受限(功能有限),并非所有字符串处理都能用正则表达式完成
字符匹配
----普通字符
大多数字母和字符一般都会和自身匹配
如正则表达式test 会和字符串‘test‘完全匹配
----元字符
. ^ $ * + ? [ ] \ | ( )
正则表达式----元字符
[ ]
----常用来指定一个字符集:[abc];[a-z]
----元字符在字符集中不起作用:[akm$]
----补集匹配不在区间范围内的字符:[^5]
s = ‘top tip tqp,twp,tep‘ r = r‘t[oi]p‘ #定义一个正则表达式,匹配到tip或top r = r‘t[^io]p‘ #定义一个正则表达式,匹配除了tip和top之外的字符 print(re.findall(r,s)) #打印结果一次为:[‘top‘, ‘tip‘] # [‘tqp‘, ‘twp‘, ‘tep‘]
^
----匹配行首。除非设置MULTILINE标识,它只是匹配字符串的开始。在MULTILINE模式里,它也可以直接匹配字符串中的每个换行
s= ‘hello world,hello boy‘ # r = r‘hello‘ #匹配hello r = r‘^hello‘ #匹配到以hello开头的 print(re.findall(r,s)) #打印结果一次为:[‘hello‘, ‘hello‘] # [‘hello‘]
$
----匹配行尾,行尾被定义为要么是字符串尾,要么是一个换行字符后面的任何位置。
r= r‘t[abc$]‘ #定义一个正则,匹配以abc结尾的字符 print(re.findall(r,‘ta‘)) #以r规则来匹配后面的字符串 print(re.findall(r,‘tb‘)) print(re.findall(r,‘t$‘)) print(re.findall(r,‘at‘)) #以r规则来匹配后面的字符串,该字符串是以t结尾,故匹配不到 #打印结果一次为:[‘ta‘] # [‘tb‘] # [‘t$‘] # []
\
----反斜杠后面可以加不同的字符以表示不同特殊意义
----也可以用于取消所有的元字符:\[或者\^
----\d 匹配任何十进制数,它相当于类[0-9]
----\D 匹配任何非数字字符,它相当于类[^0-9]
----\s 匹配任何空白字符,它相当于类[\t\n\r\f\v]
----\S 匹配任何非空白字符,它相当于类[^\t\n\r\f\v]
----\w 匹配任何字母数字字符,它相当于类[a-zA-Z0-9_]
----\W 匹配任何非字母数字字符,它相当于类[^a-zA-Z0-9_]
----可以指定正则表达式的一部分字符的重复次数
#要匹配一个座机号010-12345678这种的 r = r‘^010-\d\d\d\d\d\d\d\d‘ #也可以写成下面这种,\d8就是表示将前面的\d重复8次 r1= r‘^010-\d8‘ print(re.findall(r1,‘010-834345498888‘))
m,n
----其中m和n是十进制整数,该限定符的意思是至少重复m次,至多重复n次
r = r‘a1,3‘ #定义一个正则,表示a至少重复1次,最多重复3次 print(re.findall(r,‘a‘)) print(re.findall(r,‘aa‘)) print(re.findall(r,‘aaa‘)) print(re.findall(r,‘aaaa‘)) # 返回结果一次是:[‘a‘] # [‘aa‘] # [‘aaa‘] # [‘aaa‘, ‘a‘]
----忽略m会认为下边界是0,而忽略n的结果将是上边界为无穷大(实际上是20亿)
----0等同于*,1,等同于+,而0,1则与?相同。如果可以的话,最好使用*,+或?
*
----指定前一个字符可以被匹配零次或多次,而不是只有一次,匹配引擎会试着重复尽可能多的次数
r = r‘ab*‘ #定义一个正则 print(re.findall(r,‘a‘)) #这个就是a匹配1次,b匹配0次 print(re.findall(r,‘abb‘)) #这个就是a匹配1次,b匹配2次
+
----表示匹配一次或更多次
----注意*和+之间的不同,*匹配0或更多次,所以可以根本就不出现;而+则要求至少出现一次
r= r‘ab+‘ #定义一个正则 print(re.findall(r,‘a‘)) #以r这个正则来匹配后面的这个字符串,此时b没有,所以匹配不到 print(re.findall(r,‘ab‘)) #以r这个正则来匹配后面的这个字符串,此时ab各1次,就能被匹配到
?
----匹配一次或零次,你可以认为它用于标识某事物是可选的
r= r‘^010-\d8$‘ #定义一个正则,以010开头,加一个-,以8位数字结尾 print(re.findall(r,‘010-123456789‘)) #这里有9位数,所以匹配不到 print(re.findall(r,‘010-12345678‘)) #正好8位数,可以被匹配到 #座机号中间的-是可有可无的,可以不写,此时就可以用?来标识 r = r‘^010-?\d8$‘ print(re.findall(r,‘01012345678‘)) #此时不写-,也能被匹配到 print(re.findall(r,‘010-12345678‘)) #写一个-,也能被匹配到 print(re.findall(r,‘010--12345678‘)) #但写两个-,就匹配不到了
----?也可以用作最小匹配
r = r‘ab+‘ print(re.findall(r,‘abbbbbbbbbbbbb‘)) #做最大匹配,就是最大限度匹配abbbbbbbbbbbbb r = r‘ab+?‘ print(re.findall(r,‘abbbbbbbbbbbbb‘)) #做最小匹配,a和b只匹配一次
以上是关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章