微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

第七章 正则表达式

第七章 正则表达式
1、概览
字符串也有很多方法,可以进行搜索 (index、find 和 count)、替换 (replace) 和解析 (split),但它们仅限于处理最简单的情况
在正则表达式内部有多种方法嵌入注释,从而使之具有自文档化 (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、小结
熟悉下列技巧:
^ 匹配字符串的开始。
$ 匹配字符串的结尾。
\b 匹配一个单词的边界。
\d 匹配任意数字。
\D 匹配任意非数字字符。
x? 匹配一个可选的 x 字符 (换言之,它匹配 1 次或者 0 次 x 字符)。
x* 匹配0次或者多次 x 字符。
x+ 匹配1次或者多次 x 字符。
x{n,m} 匹配 x 字符,至少 n 次,至多 m 次。
(a|b|c) 要么匹配 a,要么匹配 b,要么匹配 c。
(x) 一般情况下表示一个记忆组 (remembered group)。你可以利用 re.search 函数返回对象的 groups() 函数获取它的值。

原文地址:https://www.jb51.cc/regex/362831.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐