zoukankan      html  css  js  c++  java
  • Python用法速查@正则表达式

    re 模块

    方法

    pattern=re.compile(regular_expressions)

    当正则被调用的多时用compile编译表达式比较合适,编译一次调用多次,可减少系统的编译开销

    import re
    
    # 将正则表达式编译成 Pattern 对象 
    pattern = re.compile(r'd+')
    
    

    match_obj=pattern.match(string)

    从第一个字符开始匹配,不成功则结束
    只要一个匹配结果

    >>> import re
    >>> pattern = re.compile(r'd+')                    # 用于匹配至少一个数字
    >>> m = pattern.match('one12twothree34four')        # 查找头部,没有匹配
    >>> print m
    None
    >>> m = pattern.match('one12twothree34four', 2, 10) # 从'e'的位置开始匹配,没有匹配
    >>> print m
    None
    >>> m = pattern.match('one12twothree34four', 3, 10) # 从'1'的位置开始匹配,正好匹配
    >>> print m                                         # 返回一个 Match 对象
    <_sre.SRE_Match object at 0x10a42aac0>
    >>> m.group(0)   # 可省略 0
    '12'
    >>> m.start(0)   # 可省略 0
    3
    >>> m.end(0)     # 可省略 0
    5
    >>> m.span(0)    # 可省略 0
    (3, 5)
    
    

    match_obj.start()

    match_obj.end()

    match_obj.span()

    match_obj.group(n)

    
    >>> import re
    >>> pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I)   # re.I 表示忽略大小写
    >>> m = pattern.match('Hello World Wide Web')
    >>> print m                               # 匹配成功,返回一个 Match 对象
    <_sre.SRE_Match object at 0x10bea83e8>
    >>> m.group(0)                            # 返回匹配成功的整个子串
    'Hello World'
    >>> m.span(0)                             # 返回匹配成功的整个子串的索引
    (0, 11)
    >>> m.group(1)                            # 返回第一个分组匹配成功的子串
    'Hello'
    >>> m.span(1)                             # 返回第一个分组匹配成功的子串的索引
    (0, 5)
    >>> m.group(2)                            # 返回第二个分组匹配成功的子串
    'World'
    >>> m.span(2)                             # 返回第二个分组匹配成功的子串
    (6, 11)
    >>> m.groups()                            # 等价于 (m.group(1), m.group(2), ...)
    ('Hello', 'World')
    >>> m.group(3)                            # 不存在第三个分组
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: no such group
    
    

    pattern.search(string)

    第一个字符不符合,可继续向后匹配
    只要一个匹配结果

    >>> import re
    >>> pattern = re.compile('d+')
    >>> m = pattern.search('one12twothree34four')  # 这里如果使用 match 方法则不匹配
    >>> m
    <_sre.SRE_Match object at 0x10cc03ac0>
    >>> m.group()
    '12'
    >>> m = pattern.search('one12twothree34four', 10, 30)  # 指定字符串区间
    >>> m
    <_sre.SRE_Match object at 0x10cc03b28>
    >>> m.group()
    '34'
    >>> m.span()
    (13, 15)
    
    
    # -*- coding: utf-8 -*-
    
    import re
     
    # 将正则表达式编译成 Pattern 对象
    pattern = re.compile(r'd+') 
     
    # 使用 search() 查找匹配的子串,不存在匹配的子串时将返回 None 
    # 这里使用 match() 无法成功匹配 
    m = pattern.search('hello 123456 789') 
     
    if m: 
        # 使用 Match 获得分组信息 
        print 'matching string:',m.group()
        print 'position:',m.span()
    #结果
    matching string: 123456
    position: (6, 12)
    
    

    pattern.findall(string)

    要所有匹配结果

    import re
     
    pattern = re.compile(r'd+')   # 查找数字
    result1 = pattern.findall('hello 123456 789')
    result2 = pattern.findall('one1two2three3four4', 0, 10)
     
    print result1
    print result2
    
    #结果
    ['123456', '789']
    ['1', '2']
    
    

    pattern.finditer(string)

    获得所有匹配结果,返回一个迭代器

    # -*- coding: utf-8 -*-
    
    import re
     
    pattern = re.compile(r'd+')
    
    result_iter1 = pattern.finditer('hello 123456 789')
    result_iter2 = pattern.finditer('one1two2three3four4', 0, 10)
    
    print type(result_iter1)
    print type(result_iter2)
    
    print 'result1...'
    for m1 in result_iter1:   # m1 是 Match 对象
        print 'matching string: {}, position: {}'.format(m1.group(), m1.span())
    
    print 'result2...'
    for m2 in result_iter2:
        print 'matching string: {}, position: {}'.format(m2.group(), m2.span())
    
    #结果
    
    <type 'callable-iterator'>
    <type 'callable-iterator'>
    result1...
    matching string: 123456, position: (6, 12)
    matching string: 789, position: (13, 16)
    result2...
    matching string: 1, position: (3, 4)
    matching string: 2, position: (7, 8)
    
    

    pattern.split(string[, maxsplit])

    maxsplit可指定最大分割次数

    import re
     
    p = re.compile(r'[s\,;]+')#按 空格 逗号 分号 分割字符串
    print p.split('a,b;; c   d')
    
    #结果
    ['a', 'b', 'c', 'd']
    
    

    pattern.sub(func, string[, maxsub])

    func 可以为返回替换字符串的函数

    import re
     
    p = re.compile(r'(w+) (w+)')
    s = 'hello 123, hello 456'
    
    def func(m):
        return 'hi' + ' ' + m.group(2)
    
    print p.sub(r'hello world', s)  # 使用 'hello world' 替换 'hello 123' 和 'hello 456'
    print p.sub(r'2 1', s)        # id形式 引用分组
    print p.sub(func, s)            # 用函数返回替换串
    print p.sub(func, s, 1)         # 最多替换一次
    
    #结果
    
    hello world, hello world
    123 hello, 456 hello
    hi 123, hi 456
    hi 123, hello 456
    
    

    pattern.subn(func, string[, maxsubn])

    返回被替换后的串,和被替换次数

    import re
     
    p = re.compile(r'(w+) (w+)')
    s = 'hello 123, hello 456'
    
    def func(m):
        return 'hi' + ' ' + m.group(2)
    
    print p.subn(r'hello world', s)
    print p.subn(r'2 1', s)
    print p.subn(func, s)
    print p.subn(func, s, 1)
    
    #结果
    
    ('hello world, hello world', 2)
    ('123 hello, 456 hello', 2)
    ('hi 123, hi 456', 2)
    ('hi 123, hello 456', 1)
    
    

    函数

    re.match(pattern, string)

    import re
    
    m1 = re.match(r'd+', 'One12twothree34four') #第一个字符不符合,匹配结束
    if m1:
        print 'matching string:',m1.group()
    else:
        print 'm1 is:',m1
        
    m2 = re.match(r'd+', '12twothree34four') #匹配到第一个符合的子串,匹配结束
    if m2:
        print 'matching string:', m2.group()
    else:
        print 'm2 is:',m2
    #结果
    m1 is: None
    matching string: 12
    
    

    re.search(pattern, string)

    re.search(pattern, string[, flags])
    
    #第一个字符匹配不成功,可以继续向后匹配,直到匹配到一个符合的返回空
    

    re.findall(pattern, string)

    import re
    
    print re.findall(r'd+', 'hello 12345 789')#匹配所有符合的子串
    
    # 输出
    ['12345', '789']
    
    

    re.finditer(pattern, string)

    #返回迭代器
    

    re.split(pattern, string[, maxsplit])

    re.sub(pattern, func, string[, count])

    re.subn(pattern, func, string[, count])

    正则表达式

    image
    实例
    python.org的正则python.org
    010-258945的正则/d{3}/-/d{6}
    数字26字母下划线组成的字符串的正则^w+$^[0-9a-zA-Z_]+$
    13、15、18开头手机号的正则^(13[0-9]|15[0|1|2|3|5|6|7|8|9]|18[0-9])d{8}$
    匹配金额,精确到小数点2位的正则^[0-9]+(.[0-9]{2})?$
    匹配汉字的正则^[u4e00-u9fa5]{0,}$

    参考

    huxi
    explore-python/Regular-expression


    ________________________________________________________

    Every good deed you do will someday come back to you.

    Love you,love word !
  • 相关阅读:
    Ecshop文件结构(Ecshop二次开发辅助文档)
    Python的Web开发环境搭建
    我的第一个.Net网站
    Windows2008R2安装sqlserver2005远程登陆失败错误18456
    SQLSERVER批量更新根据主键ID字符串
    2009年9月国内与国外浏览器市场粗略对比
    SQL2000与SQL2005下高效分页语句
    开源IIS Rewrite组件IonicIsapiRewriter2.0Releasebin
    C++中的typedef的用法
    关于NP complete
  • 原文地址:https://www.cnblogs.com/hugboy/p/re_format.html
Copyright © 2011-2022 走看看