zoukankan      html  css  js  c++  java
  • python的正则表达式

    re模块

    re.match 尝试从字符串的起始位置匹配一个模式,如果不是其实位置匹配成功的话,match()就返回None.[从起始位置开始匹配,
    只进行一次匹配]
    re.search 扫描整个字符串并返回第一个成功的匹配。【从任何位置开始匹配,只进行一次匹配】
    re.compile 用于编译正则表达式,生成一个正则表达式(Pattern)对象。
    re.findall 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。【全部匹配,返回列表】

    re.match与re.search、re.findall的区别:
    如:匹配hello,world中的he.
    re.match('he','hello,world')即可。
    如果匹配其中的wor,用re.match()则不可以。
    必须用re.search('wor','hello,world')

    res=re.compile(r'd+')
    reg=re.findall(res,'running, 123 haha, 456')
    结果是:['123','456']

    re.sub的用法:
    text='hello world haha'
    pattern=r's+'

    re.sub(pattern,'_',text)
    结果是:'hello_world_haha'
     
    text='hello world haha'
    pattern=r's+'

    re.sub(pattern,'_',text,count=1)【参数count=1代表也许找到很多,但只进行一次替换】
    结果是:'hello_world haha'



    匹配出s的值。

    s1=<geometry s="358.557561656985" x="555763.3391" y="3465063.4074" hdg="3.12539407058811757878" length="14.00167190766740610286">
    
    
    s_value = re.findall('.*s="(.*)" x=.*',s1)
    结果:['358.557561656985']
    再举一例:
    line='<geometry s="0" x="556181.3391" y="3465061.8535" hdg="3.19228842605259499621" length="7.19637334660478700243">'
    匹配出s的值,并用数字(字符)123.456代替:
    dda=re.compile('.*s="(.*)" x=.*')
    ddb=re.search(dda,line).group(1)
    need=re.sub(ddb,'123.456',line,count=1)


    #第一例:
    import re
    str1 = 'ditqq dot det,dct dit dot'
    print(re.findall('dit',str1))
    print(re.match('dit',str1).group())
    print(re.match('dit',str1))
    
    
    

    '''

    这说明:findall()匹配出来所有符合要求的字符串,并返回一个列表
    match().group只匹配符合要求的第一个字符串,返回的是一个字符串
    不加.group的话,返回第一个匹配的字符串和位置
    ['dit', 'dit']
    dit
    <_sre.SRE_Match object; span=(0, 3), match='dit'>
    '''
    #第二例:
    import re
    str1 = 'dit dot det,dct ditmm dot'
    print(re.findall('dit|dct|det',str1))
    print(re.match('det|dit|dct',str1))
    '''
    ['dit', 'det', 'dct', 'dit']
    <_sre.SRE_Match object; span=(0, 3), match='dit'>
    '''
    #第三例:
    #[]表示字符集,这个和'dit|dot|dct'是等价的
    import re
    str1 = 'dit dot det,dct dit dot'
    print(re.findall('d[ioc]t',str1))
    print(re.match('d[ioc]t',str1))
    '''
    ['dit', 'dot', 'dct', 'dit', 'dot']
    <_sre.SRE_Match object; span=(0, 3), match='dit'>
    '''
    #第四例:
    #^符号表示“排除”
    import re
    str1 = 'dit dot det,dct dit dot'
    print(re.findall('d[^ic]t',str1))
    print(re.match('d[^ic]t',str1))
    print(re.match('d[i]t',str1))
    print(re.match('d[o]t',str1))
    '''
    .match()必须是从字符串的开头进行匹配
    ['dot', 'det', 'dot']
    None
    <_sre.SRE_Match object; span=(0, 3), match='dit'>
    None
    '''
    #第五例 ^还可以标识以...开头
    import re
    str1 = 'dit dot det,dct dit dot'
    print(re.findall('^dit',str1))
    print(re.findall('^dct',str1))
    print(re.match('^dot',str1))
    print(re.match('^dit',str1))
    '''
    ['dit']
    []
    None
    <_sre.SRE_Match object; span=(0, 3), match='dit'>
    '''
    #第六例:
    import re
    str1 = 'dit dot det,dct dit dot'
    print(re.findall('dot$',str1))
    print(re.findall('dct$',str1))
    print(re.match('dot$',str1)) #只能是开头匹配,无法指定末尾匹配
    '''
    ['dot']
    []
    None
    '''
    #第七例:
    # d.t表示d与t之间省略了任意一个字符:
    # *表示至少零个
    # +表示至少一个
    import re
    str1 ='dict ### dot det,,,,dct dit dot'
    print(re.findall('d.t',str1))
    print(re.findall('d.*t',str1))
    print(re.findall('d.+t',str1))
    '''
    ['dot', 'det', 'dct', 'dit', 'dot']
    ['dict ### dot det,,,,dct dit dot']
    ['dict ### dot det,,,,dct dit dot']
    '''
    #第八例:
    # *表示匹配0个或多个
    # +表示匹配1个或多个
    import re
    str1 = 'd dt dit diit det'
    print(re.findall('d.+t',str1))
    print(re.findall('d.*t',str1))
    print(re.match('d.*t',str1))
    
    '''
    ['d dt dit diit det']
    ['d dt dit diit det']
    <_sre.SRE_Match object; span=(0, 17), match='d dt dit diit det'>
    '''
    #第九例:
    # *表示匹配0个或者一个
    # +表示匹配0个或者一个
    # .findall()函数从任意位置处开始匹配
    # .match()函数从开头处开始匹配
    import re
    str1 = 'cd dt dit diit det'
    print(re.findall('d.+t',str1))
    print(re.findall('d.*t',str1))
    print(re.match('d.*t',str1))
    
    '''
    ['d dt dit diit det'] 
    ['d dt dit diit det']
    None
    '''
    #第十例:
    #贪婪匹配
    #?作用一:看.+的匹配结果,'dit''dot'也满足'd.+t'的匹配条件,而输出的
    # 却是满足匹配条件的最长子串'dit dot det,dct dit dot',这个叫贪婪匹配。如
    # 果要输出最短的匹配字串,只需在'+'后面加上'':(注:对于'*'也是一样,只
    # 需在'*'后面加上'')
    import re
    str1 = 'd dt dit diit det'
    print(re.findall('d.+t',str1)) #贪婪模式
    print(re.findall('d.+?t',str1)) #加问号变成非贪婪模式
    print(re.findall('d.*?t',str1)) #非贪婪模式
    print(re.match('d.*t',str1))
    print(re.match('d.*?t',str1)) #非贪婪模式
    
    '''
    贪婪模式就是一口吃个胖子,非贪婪模式就是细嚼慢咽
    ['d dt dit diit det']
    ['d dt', 'dit', 'diit', 'det']
    ['d dt', 'dit', 'diit', 'det']
    <_sre.SRE_Match object; span=(0, 17), match='d dt dit diit det'>
    <_sre.SRE_Match object; span=(0, 4), match='d dt'>
    '''
    #第十一例:
    # ?作用二:di?t表示i可有可无,即dt、dit都满足匹配条件:
    import re
    str1 = 'dt dt dit diit det'
    print(re.findall('dii?t',str1))
    print(re.match('di?t',str1))
    '''
    ['dit', 'diit']
    <_sre.SRE_Match object; span=(0, 2), match='dt'>
    '''
    #第十二例:
    # {}作用一:di{n}t表示d和t之间有n个'i':
    import re
    str1 = 'dt dit diit diiit diiiit'
    print(re.findall('di{2}t',str1))
    
    '''
    ['diit']
    '''
    #第十三例:
    # {}作用二:di{n,m}t表示d和t之间有n到m个'i'
    import re
    str1 = 'dt dit diit diiit diiiit'
    print(re.findall('di{1,3}t',str1))
    
    '''
    ['dit', 'diit', 'diiit']
    '''

     

    #第十四例:
    # 其中,n和m都是可以省略的。{n,}表示n个到任意个;{,m}表示0个到m个;
    # {,}表示任意个,和'*'功能一样:
    import re
    str1 = 'dt dit diit diiit diiiit'
    print(re.findall('di{1,}t',str1))
    print(re.findall('di{,3}t',str1))
    print(re.findall('di{,}t',str1))
    
    '''
    ['dit', 'diit', 'diiit', 'diiiit']
    ['dt', 'dit', 'diit', 'diiit']
    ['dt', 'dit', 'diit', 'diiit', 'diiiit']
    '''
    #第15例:
    # 作用一:取消元字符,变成普通字符:
    import re
    str1 = '^abc ^abc'
    print(re.findall('^abc',str1))
    print(re.findall('^abc',str1))
    
    '''
    []
    ['^abc', '^abc']
    '''
    #第16例:
    # 作用二:跟普通字符放在一起,让普通字符变成转义字符:
    import re
    str1 = '12 abc 345 efgh'
    print(re.findall('d+',str1))
    print(re.match('d+',str1))
    print(re.findall('w+',str1))
    '''
    ['12', '345']
    <_sre.SRE_Match object; span=(0, 2), match='12'>
    ['12', 'abc', '345', 'efgh']
    '''
    #第17例:
    # ()作用:在匹配字符串后,只输出匹配字串'()'里面的内容:
    import re
    str1 = '12abcd34'
    print(re.findall('12abcd34',str1))
    print (re.findall('1(2a)bcd34',str1))
    print (re.findall('1(2a)bc(d3)4',str1))
    '''
    ['12abcd34']
    ['2a']
    [('2a', 'd3')]
    '''
    #第18例:
    # re模块里的主要方法:findall()、finditer()、match()、search()、compile()、
    # split()、sub()、subn()。
    # re.findall(pattern,string,flags = 0)作用:在string中从左往右搜索与
    # pattern(有样品的意思)匹配的字串,结果以list形式返回。
    import re
    str1 = 'ab _  + # 321_cd'
    print(re.findall('w+',str1))
    
    '''
    ['ab', '_', '321_cd']
    '''
    #第19例:
    # re.compile(pattern,flags = 0)
    # 作用:对匹配格式pattern进行编译,返回一个实例对象。对正则表达式先编译,
    # 可以大幅提高匹配速度。
    import re
    str1 = 'ab cd'
    pre = re.compile('ab')
    print(pre.findall(str1))
    '''
    本例重要!
    ['ab']
    '''
    #第20例:
    # re.split(pattern,string,maxsplit = 0,flags = 0)
    # 作用:在string匹配pattern的时候做分割:
    import re
    str1 = 'ab.c.de'
    str2 = '12+34-56*78/90'
    print(re.split('.',str1))
    print(re.split('[+-*/]',str2))
    print(str1.split('.'))
    print(str2.split('+'))
    '''
    ['ab', 'c', 'de']
    ['12', '34', '56', '78', '90']
    ['ab', 'c', 'de']
    ['12', '34-56*78/90']
    '''

     

    #第21例:
    # re.search(pattern,string,flags = 0)
    # 作用:在string中从左往右搜索与pattern匹配的字串,无匹配结果则返回None,
    # 否则返回一个search实例。
    import re
    str1 = 'ab cd'
    result = re.search('cd',str1)
    if result == None:
      print('None')
    else:
      print(result.group(),result.start(),result.end())
    '''
    cd 3 5
    '''
    #第22例:
    # re.subn(pattern,repl,string,count = 0,flags = 0)
    # 作用:其功能与re.sub()相同,但返回的结果多了一个数字,代表替换了多少次
    import re
    str1 = 'abc  de  bce'
    print(re.subn('bc','123',str1))
    
    '''
    ('a123  de  123e', 2)
    '''
    '''
    代码 说明
    . 匹配除换行符以外的任意字符
    w 匹配字母或数字或下划线
    s 匹配任意的空白符
    d 匹配数字
     匹配单词的开始或结束
    ^ 匹配字符串的开始
    $ 匹配字符串的结束
    '''
    *   重复零次或多次
    + 重复一次或多次
    ? 重复零次或一次
    {n} 重复n次
    {n,} 重复n次到多次
    {,m} 重复0次到m次
    {n,m} 重复n到m次

    W  匹配任意不是字母,数字,下划线,汉字的字符
    S 匹配任意不是空白符的字符
    D 匹配任意非数字的字符
    B 匹配不是单词开头或结束的位置
    [^x] 匹配除了x以外的任意字符
    [^aeiou] 匹配除了aeiou这几个字母以外的任意字符
  • 相关阅读:
    致21岁的自己
    nginx 入门实战
    软件测试的分类
    Springboot 使用 Jedis
    NodeJS模块、包、NPM
    NodeJS介绍
    毫秒必争,前端网页性能最佳实践--转载
    IT主要在线学习网站
    电商峰值系统架构设计--转载
    查看w3wp进程占用的内存及.NET内存泄露,死锁分析--转载
  • 原文地址:https://www.cnblogs.com/yibeimingyue/p/9911667.html
Copyright © 2011-2022 走看看