1、概览
在正则表达式内部有多种方法嵌入注释,从而使之具有自文档化 (self-documenting) 的能力
2、个案研究:街道地址
1)在字符串的结尾匹配
>>> s = '100 NORTH MAIN ROAD' >>> import re #所有和正则表达式相关的功能都包含在 re 模块中 >>> re.sub('ROAD$','RD.',s) #只有当 'ROAD' 出现在一个字符串的尾部时才会匹配 '100 NORTH BROAD RD.'
字符$表示“字符串的末尾”(还有一个对应的字符,尖号^,表示“字符串的开始”)
2)匹配整个单词
>>> s = '100 BROAD' >>> re.sub(r'\bROAD$',s) #“原始字符串”,只要为字符串添加一个前缀 r 就可以了。 \b,它的含义是“单词的边界必须在这里” '100 BROAD' >>> s = '100 BROAD ROAD APT. 3' >>> re.sub(r'\bROAD\b',s) #匹配字符串中作为整个单词出现的'ROAD' '100 BROAD RD. APT 3'
3、个案研究:罗马字母
1)校验千位数
>>> import re >>> pattern = '^M?M?M?$' #匹配 0 次到 3 次字符 M,字符 ^ 和字符 $ 结合使用匹配整个串 >>> re.search(pattern,'MM') <SRE_Match object at 0106C290>
2)校验百位数
>>> import re >>> pattern = '^M?M?M?(CM|CD|D?C?C?C?)$' >>> re.search(pattern,'MCM') <SRE_Match object at 01070390>
4、使用 {n,m} 语法
普通方法:
>>> pattern = '^M?M?M?(CM|CD|D?C?C?C?)(XC|XL|L?X?X?X?)(IX|IV|V?I?I?I?)$'
{n,m} 语法表达:
>>> pattern = '^M{0,3}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$'
5、松散正则表达式
带有内联注释 (Inline Comments) 的正则表达式
>>> pattern = """ ^ # beginning of string M{0,3} # thousands - 0 to 3 M's (CM|CD|D?C{0,3}) # hundreds - 900 (CM),400 (CD),0-300 (0 to 3 C's),# or 500-800 (D,followed by 0 to 3 C's) (XC|XL|L?X{0,3}) # tens - 90 (XC),40 (XL),0-30 (0 to 3 X's),# or 50-80 (L,followed by 0 to 3 X's) (IX|IV|V?I{0,3}) # ones - 9 (IX),4 (IV),0-3 (0 to 3 I's),# or 5-8 (V,followed by 0 to 3 I's) $ # end of string """ >>> re.search(pattern,'M',re.VERBOSE) #必须传递一个额外的参数 re.VERBOSE,标志着待匹配的正则表达式是一个松散正则表达式 <_sre.SRE_Match object at 0x008EEB48>
6、个案研究:解析电话号码
>>> phonePattern = re.compile(r''' # don't match beginning of string,number can start anywhere (\d{3}) # area code is 3 digits (e.g. '800') \D* # optional separator is any number of non-digits (\d{3}) # trunk is 3 digits (e.g. '555') \D* # optional separator (\d{4}) # rest of number is 4 digits (e.g. '1212') \D* # optional separator (\d*) # extension is optional and can be any number of digits $ # end of string ''',re.VERBOSE) >>> phonePattern.search('work 1-(800) 555.1212 #1234').groups() ('800','555','1212','1234') >>> phonePattern.search('800-555-1212') ('800','')
7、小结
熟悉下列技巧: