正则表达式是搜索、替换和解析复杂字符串的一种强大而标准的方法,Python中的正则相关的东西全在re模块下。
1 常用的匹配
^匹配字符串的开始
$匹配字符串的结尾
\b匹配一个单词的边界
\d匹配任意数字
\D匹配任意非数字字符
x?匹配一个可选的x(匹配1次或0次x字符)
x*匹配0次或多次x
x+匹配1次或多次x
x{n,m}至少n次,至多m次x
(a|b|c)要么匹配a,要么匹配b,要么匹配c
(x)一般情况下表示一个记忆组,你可以利用re.search函数返回对象的groups()函数来获取它的值
2 一般用途
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#------------------------------------------------------------------------------- # coding: utf-8 # Purpose:正则表达式 # # Author: zdk # # Created: 26/02/2013 # Copyright: (c) zdk 2013 #------------------------------------------------------------------------------- import re if __name__ = = '__main__' : addr = "100 BROAD ROAD APT.3" print (re.sub( "ROAD" , "RD" ,addr)) # 100 BRD RD APT.3 print (re.sub(r "\bROAD\b" , "RD" ,addr)) # 100 BROAD RD APT.3 pattern = ".*B.*(ROAD)?" print (re.search(pattern, "ROAD" )) #None print (re.search(pattern, "B" )) #<_sre.SRE_Match object at 0x0230F020><span style="background-color:#FAFAFA;font-family:Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace;font-size:1em;line-height:1.5;"> </span> |
(1)re.sub("ROAD","RD",addr) 利用re.sub函数对字符串addr进行搜索,满足表达式"ROAD"的用“RD”替换
(2)re.sub(r"\bROAD\b","RD",addr) ,“\b”含义是“单词的边界”,在Python中,由于字符“\”在字符串中必须转义,这会变得非常麻烦,所以Python用前缀r表示字符串中的所有字符都不转义。
(3)re.search(pattern,"ROAD") re模块有一个search函数,该函数有两个参数,一个是正则表达式,一个是字符串,search函数返回一个拥有多种方法可以描述这个匹配的对象,如果没有发现匹配,则返回None。
3 松散正则表达式
上面均是“紧凑”类型的表达式,它比较难以阅读,即使现在清楚表达式的含义,也不能保证几个月后还能记得。所以Python允许用户利用所谓的松散正则表达式来完成内联文档的需要,和一般的表达式有以下两个方面的主要区别
忽略空白符。空格符、制表符、回车符不匹配它们自身(如果你想在松散正则表达式中匹配一个空格符,你不须在它前面添加一个反斜杠符号对它进行转义)
忽略注释。和普通的Python代码一样,注释开始于#符号,结束于行尾。
1
2
3
4
5
6
7
8
9
|
#松散带有内联注释的正则表达式 pattern = """ ^ # begin of string M{0,3} # 0 to 3 M (CM|CD|D?C{0,3}) #CM or CD or D or D 0 to 3 C $ #end of string """ print (re.search(pattern, "MCM" ,re.VERBOSE)) #<_sre.SRE_Match object at 0x021BAF60> print (re.search(pattern, "M99" ,re.VERBOSE)) #None |