zoukankan      html  css  js  c++  java
  • 09_Python_RE正则表达式

    1、re模块简介

    • 在 Python 中,已经内置了一个re模块,用来帮助我们使用正则表达式。

    【re模块中的函数】

           函数  	            描述
    compile(pattern)	        创建模式对象
    search(pattern,string)	    在字符串中寻找模式
    match(pattern,string)  	在字符串开始处匹配模式
    split(pattern,string)	    根据模式分割字符串
    findall(pattern,string)	    列表形式返回匹配项
    sub(pat,repl,string)	    pat匹配想用repl替换
    escape(string)	            特殊字符转义
    

    2、compile 函数

    • compile 函数用于编译正则表达式,生成一个 Pattern 对象,它的一般使用形式如下:
    re.compile(pattern[, flag])
    
    
    - pattern 是一个字符串形式的正则表达式,
    - flag 是一个可选参数,表示匹配模式,比如忽略大小写,多行模式等。
    
    • 实例
    import re
    # 将正则表达式编译成 Pattern 对象 
    pattern = re.compile(r'd+')
    

    2.1、match 方法

    • match 方法用于查找字符串的头部(也可以指定起始位置),它是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有匹配的结果。
    • 它的一般使用形式如下:
    match(string[, pos[, endpos]])
    
    
    
    - string 是待匹配的字符串;
    - pos 和 endpos 是可选参数,指定字符串的起始和终点位置,默认值分别是 0 和 len (字符串长度)。因此,当你不指定 pos 和 endpos 时,match 方法默认匹配字符串的头部。
    - 当匹配成功时,返回一个 Match 对象,如果没有匹配上,则返回 None。
    
    • 实例
    import re
    
    pattern = re.compile(r'd+')  # 用于匹配至少一个数字
    m = pattern.match('0123456789ur', 3, 10)  # 从'3'的位置开始匹配,
    
    print(m)  # 返回一个 Match 对象
    
    # group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0);
    print(m.group(0))
    
    # start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
    print(m.start(0))
    
    # end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;
    print(m.end(0))
    
    # span([group]) 方法返回 (start(group), end(group))。
    print(m.span(0))
    

    2.2、search 方法

    • search 方法用于查找字符串的任何位置,它也是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有匹配的结果。
    • 它的一般使用形式如下:
    search(string[, pos[, endpos]])
    
    
    - string 是待匹配的字符串;
    - pos 和 endpos 是可选参数,指定字符串的起始和终点位置,默认值分别是 0 和 len (字符串长度)。
    - 当匹配成功时,返回一个 Match 对象,如果没有匹配上,则返回 None。
    
    • 实例
    import re
    
    pattern = re.compile(r'd+')  # 用于匹配至少一个数字
    m = pattern.search('one12twothree34four')
    print(m.group())    # 输出:12
    
    '''2、指定字符串区间'''
    m1 = pattern.search('one12twothree34four', 10, 30)
    print(m1)           # 输出:<_sre.SRE_Match object; span=(13, 15), match='34'>
    print(m1.group())   # 输出:34
    print(m1.span())     # 输出:(3, 5)
    

    2.3、findall 方法

    • findall 以列表形式返回全部能匹配的子串,如果没有匹配,则返回一个空列表。
    • findall 方法的使用形式如下:
    findall(string[, pos[, endpos]])
    
    
    - string 是待匹配的字符串;
    - pos 和 endpos 是可选参数,指定字符串的起始和终点位置,默认值分别是 0 和 len (字符串长度)。
    
    • 实例:
    import re
    
    '''1、返回全部能匹配的子串'''
    
    pattern = re.compile(r'd+')
    m = pattern.findall('one12twothree34four')
    print(m)  # 输出:['12', '34']
    
    '''2、指定字符串区间'''
    
    m1 = pattern.findall('one12twothree34four', 0, 10)
    print(m1)  # 输出:['12']
    

    2.4、finditer 方法

    • finditer 方法的行为跟 findall 的行为类似,也是搜索整个字符串,获得所有匹配的结果。但它返回一个顺序访问每一个匹配结果(Match 对象)的迭代器。

    • 实例:

    import re
    
    pattern = re.compile(r'd+')
    result_01 = pattern.finditer('one1two2three3four4')
    print(result_01)
    for i in result_01:
        print(i.group())
    
    # 输出结果:
    '''
    1
    2
    3
    4
    '''
    

    2.5、split 方法

    • split 方法按照能够匹配的子串将字符串分割后返回列表。
    • 它的使用形式如下:
    split(string[, maxsplit])
    
    - maxsplit 用于指定最大分割次数,不指定将全部分割。
    
    • 实例:
    import re
    
    pattern = re.compile(r'd+')
    # 匹配数字,根据数字把字符串切割成列表
    result_01 = pattern.split('one1two2three3four')
    print(result_01)
    # 输出结果:['one', 'two', 'three', 'four']
    

    2.6、sub 方法

    • sub 方法用于替换。它的使用形式如下:
    sub(repl, string[, count])
    
    
    repl 可以是字符串也可以是一个函数:
        1、 repl 是字符串,则会使用 repl 去替换字符串每一个匹配的子串,并返回替换后的字符串,另外,repl 还可以使用 id 的形式来引用分组,但不能使用编号 0;
        2、repl 是函数,这个方法应当只接受一个参数(Match 对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。
    
    count 用于指定最多替换次数,不指定时全部替换。
    
    • 实例:
    import re
    
    '''1、repl 是字符串'''
    
    pattern = re.compile(r'd+')
    s = 'one1two2three3four'
    # 匹配数字,根据数字把字符串切割成列表
    result_01 = pattern.sub('替换', s)
    print(result_01)
    
    # 输出结果:one替换two替换three替换fou
    
    
    '''1、repl 是函数'''
    
    def func(m):
        return '替换' + ' ' + m.group()
    
    
    result_02 = pattern.sub(func, s)
    print(result_02)
    
    # 输出结果:one替换 1two替换 2three替换 3four
    

    3、match 函数

    • match 函数的使用形式如下:
    re.match(pattern, string[, flags]):
    
    
    • 实例:
    import re
    
    result_01 = re.match(r'd+', '2One12twothree34four')
    print(result_01.group())  # 输出:2
    

    4、search 函数

    • search 函数的使用形式如下:
    re.search(pattern, string[, flags])
    
    

    5、findall 函数

    • findall 函数的使用形式如下:
    re.findall(pattern, string[, flags])
    
    '''【实例】'''
    
    import re
    
    result_01 = re.findall(r'd+', '2One12twothree34four')
    print(result_01)  # 输出:['2', '12', '34']
    
    

    6、finditer 函数

    • finditer 函数的使用形式如下:
    re.finditer(pattern, string[, flags])
    
    

    7、split 函数

    • split 函数的使用形式如下:
    re.split(pattern, string[, maxsplit])
    
    

    8、sub 函数

    • sub 函数的使用形式如下:
    re.sub(pattern, repl, string[, count])
    
    

    9、匹配中文

    import re
    
    title = u'你好,hello,世界'
    
    pattern = re.compile(r'[u4e00-u9fa5]+')
    result = pattern.findall(title)
    print(result)
    # 输出结果:['你好', '世界']
    
    

    10、正则表达模式

    
    '''字符匹配'''
    
    实例	            描述
    [Pp]ython	    匹配 "Python" 或 "python"
    rub[ye]	        匹配 "ruby" 或 "rube"
    [aeiou]	        匹配中括号内的任意一个字母
    [0-9]	        匹配任何数字。类似于 [0123456789]
    [a-z]	        匹配任何小写字母
    [A-Z]	        匹配任何大写字母
    [a-zA-Z0-9] 	匹配任何字母及数字
    [^aeiou]	    除了aeiou字母以外的所有字符
    [^0-9]	        匹配除了数字外的字符
    
    
    '''特殊字符类'''
    
    实例	            描述
    .	            匹配除 "
    " 之外的任何单个字符。要匹配包括 '
    ' 在内的任何字符,请使用象 '[.
    ]' 的模式。
    d	            匹配一个数字字符。等价于 [0-9]。
    D	            匹配一个非数字字符。等价于 [^0-9]。
    s	            匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ f
    
    	v]。
    S	            匹配任何非空白字符。等价于 [^ f
    
    	v]。
    w	            匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
    W	            匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
    
    

    参考:

  • 相关阅读:
    [转]数据库表分割技术:水平分割、垂直分割、库表散列
    [转]Oracle 11g RAC SCAN ip的原理及配置
    [转]Oracle 11g R2 RAC高可用连接特性 – SCAN详解
    [转]Redis之(一)初识Redis
    Oracle笔记
    weblogic新增域并进行Jconsole监听
    Geth命令用法-参数详解 and 以太坊源码文件目录
    python闭包,看不懂请揍我
    MPT树详解
    RLP(转发注明出处)
  • 原文地址:https://www.cnblogs.com/jasontang369/p/9245935.html
Copyright © 2011-2022 走看看