美文网首页程序员Python 运维
python(学会正则走天下)

python(学会正则走天下)

作者: 苏鑫的博客 | 来源:发表于2017-06-14 15:25 被阅读0次

    python通过re模块来实现。本篇文章着重对Python的RE进行介绍
    re 模块
    首先通过 re.compiler把正则表达式编译成Pattern对象:

     pattern = re.compiler(r'python')
    

    这里r'python'的r是表示后面的字符串是原生字符串避免了转义字符导致的麻烦
    比如

       #两者是等价的
       pattern = re.compiler(r'\\')
       pattern = re.compiler('\\\\')
    

    同样都是匹配双斜杠,用原声字符串就会变得很简洁明了。
    Pattern的属性:

    
        pattern: 编译时用的表达式字符串。
        flags: 编译时用的匹配模式。
        groups: 表达式中组的数量。
        groupindex: 有别名的组的字典,别名是键,编号是值。
    
    

    match 的属性:

    #coding:utf-8
    import re
     
    
    match = re.match(r'(\w+) (?P<python>\w+)(.?)','hello python!')
    
    print 'match.string:',match.string          #匹配的字符串
    
    print 'match.re:',match.re                   #使用pattern对象的位置
    
    print 'match.pos:',match.pos                 #匹配字符串的开始位置
    
    print 'match.endpos:',match.endpos           #匹配字符串的结束位置
    
    print 'match.lastindex:',match.lastindex     #最后一个被捕获的分组在文本中的索引
    
    print 'match.lastgroup:',match.lastgroup     #最后一个被捕获的分组的别名
    
    print 'match.group(1,3):',match.group(1,2,3) #获取元组中第123个元素
    
    print 'match.group():',match.group()         #group不添加参数默认值为0返回所有匹配的字符串
    
    print 'match.groupdict():',match.groupdict() #获取字典用别名作为字典的键值
    
    print 'match.start(1):',match.start(1)     #获取指定组匹配子串在string中的开始索引
    
    print 'match.end(1):',match.end(1)         #获取指定组匹配子串在string中的结束索引
    
    print 'match.span(1,1):',match.span(1)     #返回star(1)+end(1)
    
    print r"m.expand(r'\3 \2 \1):",match.expand(r'\3 \2 \1')#重新定义组合返回
    '''------------output--------------------
    match.string: hello python!
    match.re: <_sre.SRE_Pattern object at 0x7f46cf885ad0>
    match.pos: 0
    match.endpos: 13
    match.lastindex: 3
    match.lastgroup: None
    match.group(1,3): ('hello', 'python', '!')
    match.group(): hello python!
    match.groupdict(): {'python': 'python'}
    match.start(1): 0
    match.end(1): 5
    match.span(1,1): (0, 5)
    m.expand(r'\3 \2 \1): ! python hello
    ''' 
    

    re模块中提供给我们的一些方法:

    1.match(pattern,string,flags)|pattern.match(string,flags)
    2.search(pattern,string,flags)|pattern.search(string,flags)
    3.split(string,maxspilit,flags)|re.split(pattern,sting,maxspilt,flags)
    4.findall(string,flags)|re.findall(pattern,string,flags)
    5.finditer(string,flags)|re.finditer(pattern,string,flags)
    6.sub(repl,string,count,flags)|re.sub(pattern,repl,string,count,flags)
    7.subn(repl,string,count,flags)|re.subn(pattern,reple,string,count,flags)
    

    这些方法的使用

    #-*-coding:utf-8-*-
    import re
    
    pattern = re.compile(r'(\w+) (\w+)(.?)')
    
    text = 'hello python! hello python!'
    print '-----match-----'
    #重头开始匹配
    match = pattern.match(text)
    print match.group()
    '''
    -----match-----
    hello python!
    
    '''
    
    print '------search-----'
    #全局匹配
    search = pattern.search(text)
    print search.group()
    '''
    ------search-----
    hello python!
    
    
    '''
    
    print '------split------'
    #通过分割的子串将string进行分割,返回list maxsplit分割最大次数默认为全部
    split = re.split(r'\s',text)
    print split
    '''
    ------split------
    ['hello', 'python!', 'hello', 'python!']
    
    
    '''
    
    print '-------findall------'
    #搜索string,以列表形式返回全部能匹配的子串。
    findall = re.findall(r'\w+',text)
    print findall
    
    '''
    -------findall------
    ['hello', 'python', 'hello', 'python']
    
    
    '''
    
    print '-----findite-------'
    #搜索string,返回match对象
    finditer = re.finditer(r'\w+',text)
    for m in finditer:
      print m.group()
    
    '''
    -----findite-------
    hello
    python
    hello
    python
    
    
    '''
    
    print '-------sub---------'
    #替换子串repl可以是字符串可以是方法可以使用\id \g<id> \g<name>引用分组
    sub = re.sub(r'(\w+)','bye',text,count=1)
    print sub
    sub = re.sub(r'(\w+) (\w+)',r'\2 \1',text)
    print sub
    def func(m):
      return m.group(1)+' the world '
    sub = re.sub(r'(\w+) (\w+)',func,text)
    print sub
    
    '''---------output--------
    -------sub---------
    bye python! hello python!
    python hello! python hello!
    hello the world ! hello the world !
    
    
    '''
    
    
    print '--------subn--------'
    #返回sub  (sub(repl,string,count))
    subn = re.subn(r'(\w+)','bye',text)
    print subn
    subn = re.subn(r'(\w+) (\w+)',r'\2 \1',text)
    print subn
    def func(m):
      return m.group(1)+' the world '
    subn = re.subn(r'(\w+) (\w+)',func,text)
    print subn
    
    
    '''---------output--------
    --------subn--------
    ('bye bye! bye bye!', 4)
    ('python hello! python hello!', 2)
    ('hello the world ! hello the world !', 2)
    '''
    
    
    '''
    
    

    以上就是python正则表达式的使用,接下来还会有一个正则表达式的元字符跟语法的文章,代码社会入门小学生一枚希望大家指导不足跟缺点,提供建议。

    -----------每天进步一点点,坏狗狗就会离开

    相关文章

      网友评论

        本文标题:python(学会正则走天下)

        本文链接:https://www.haomeiwen.com/subject/gzdsqxtx.html