[Python]第六课笔记--正则表达式

培训第六课 re的使用
    re使用流程:模式串->表达式对象->匹配目标文本

    常用元字符:

        . :除换行符以外的任何字符
        \ :转义字符 当我们把元字符当做普通字符去匹配的时候
        [] :字符集合匹配
        \d :数字匹配 0-9
        \D :非数字的匹配[^0-9]
        \s :非空白字符[ \t\r\n\f\n]
        \S :f非空白字符[^\s]
        \w :字母数字[A-Za-z0-9]
        \W :非字母数字[^\w]
        #说白了,大写和小写的正好是补集的关系
        #使用compile会快一点
>>> p = re.compile(r'nihao')
>>> type(p)

        #匹配字符前面加r,少一些不必要的麻烦


In [10]: rs = p.match('abc abcde abcdd')
#使用mathch方法,匹配成功返回一个mactch对象,没有成功就返回None
In [11]: print rs
<_sre.SRE_Match object at 0x03638918>
In [12]: rs.group()  #mathc只返回一个匹配到的字符
Out[12]: 'abc'
        

        数量匹配:

        + :一次或者多次 
        ?:一次或者0次 
        * :任意次数,0次,1次,多次
        {m} :匹配前一个字符m次
        {m,n}: 匹配前一个字符m到n次
        
        数量词?:非贪婪模式 ex:[i]*?    
In [14]: p = re.compile('[abc]{2,3}') #默认是贪婪模式,总是匹配到最大限度
In [15]: p.findall('abcabcbc')
Out[15]: ['abc', 'abc', 'bc']
In [16]: p = re.compile('[abc]{2,3}?') #加了?以后变成非贪婪,最小匹配就返回
In [17]: p.findall('abcabcbc')
Out[17]: ['ab', 'ca', 'bc', 'bc']
        

        边界:

        ^ :匹配字符串的开头,多行就匹配每一行的开头
        $ :匹配字符串的结尾,多行就匹配每一行的结尾
        \A :仅匹配字符串的开头
        \Z :仅匹配字符串的末尾
        \b :匹配 \w \W之间


        逻辑分组:

        | :或操作
        (..) :分组匹配,匹配返回值
        (?...):分组匹配,不返回匹配值
        \ :引用到编号为num的分组匹配到的串 
        (?P):分组命名
        (?p=name): 引用分组,不提取值 
        #分组操作和group字样的方法关系密切
#不分组不提取
In [52]: re.findall(r'(?:a)b','abc')
Out[52]: ['ab']
#分组命名
In [54]: m = re.match(r'(?Pa)(b)','abc')
In [55]: m.groups()
Out[55]: ('a', 'b')
In [56]: m.groupdict()
Out[56]: {'a': 'a'}
        

        特殊构造:

        (?:..) :不分组 
        (?iLmsux) :不同模式
        (?#...) :#注释
        (?=...) :之后满足才返回字符
        (?!...) :
        (?<=...) :
        (?         (?(id/name)yes|no) :
In [69]: re.findall(r'a(?=\d)','a3 a4')
Out[69]: ['a', 'a']


        匹配模式:

        re.I 忽略大小写 
        re.M 多行模式改变为^ $的行为,忽略换行 
        re.S .任意匹配模式,包括换行
        re.U 使用\w\W\b\B\s\S\d\D取决于UNIcode字符属性
        re.X 详细模式 
        re.L 使用预订字符串类\w\W\b\B\s\S取决于当前区域设定
        (?iLmsux) :不同模式 一般放在表达式的开头,其他位置也行
        

        常用函数:

            compile
            pattern
            match
            serach
            split
            findall
            finditer
            sub
            ?match和search的区别      


         
        

你可能感兴趣的:(如今Python)