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

    正则表达式: 

    一,简介:

    正则表达式(或RE)是一种小型的,高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现,再被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行

    元字符:

    .匹配除换行符 之外的任何单字符。要匹配 .,请使用 。

    ^匹配输入字符串的开始位置^

    $匹配输入字符串的结尾位置

    *匹配当前子表达式0次或者多次 

    +匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +

    ?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?

    {}匹配前一个字符m次

    []常用来制定一个字符集,如[ab]匹配 a 或b;其他的元字符在[]中不起作用,除了【-】【^】

    |指明两项之间的一个选择。要匹配 |,请使用 |

    ()被括起来的表达式将作为分组盲么,从表达式左边开始遇到每一个分组左括号(编号+1)

    另外,分组表达式作为一个整体,可以后接数量词,表达式中 | 仅在改组有效

    将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符

    import re
    
    print(re.findall('q.w','dsqdw')) #通配符匹配一个字符
    print(re.findall('q..w','dsqdgw'))# 匹配内容之间的内容 print(re.findall('a.c','dsa.cdc')) #转义字符 使后一个字符改变原来的意思 D:python3.5python.exe D:/untitled/python3/day正则练习.py ['qdw'] ['a.c'] Process finished with exit code 0
    import re
    
    print(re.findall('^a','asd')) 
    print(re.findall('^as','asdf'))
    print(re.findall('^asd','asdfd'))
    print(re.findall('[^1-9]','ww3aa8.d')),'ww3aa8.d'))
    
    D:python3.5python.exe D:/untitled/python3/lianxi.py
    ['a']
    ['as']
    ['asd']
    ['w', 'w', 'a', 'a', '.', 'd']
    
    Process finished with exit code 0
    
    print(re.findall('as$','dfas'))
    print(re.findall('fd$','asdfd'))
    print(re.findall('[1-9$]','ww3aa8.d'))
    
    D:python3.5python.exe D:/untitled/python3/lianxi.py
    ['as']
    ['fd']
    ['3', '8']
    
    Process finished with exit code 0
    
    import re
    print(re.findall('abc*','abcdefg'))
    print(re.findall('as*','asssssddd'))
    
    D:python3.5python.exe D:/untitled/python3/lianxi.py
    ['abc']
    ['asssssss']
    
    Process finished with exit code 0
    
    print(re.findall('as+','asddddd'))
    print(re.findall('sd+','asdwsdd'))
    
    D:python3.5python.exe D:/untitled/python3/lianxi.py
    ['as']
    ['sd', 'sdd']
    
    print(re.findall('asc?','asa'))
    print(re.findall('azx?','azxazxs'))
    
    D:python3.5python.exe D:/untitled/python3/lianxi.py
    ['as']
    ['azx', 'azx']
    
    Process finished with exit code 0
    
    print(re.findall('ac{1}b','acbcc'))
    
    匹配前一个字符m次或n次
    print(re.findall('ab{1,2}c','abbcbb'))
    
    
    D:python3.5python.exe D:/untitled/python3/lianxi.py
    ['acb']
    ['abbc']
    
    Process finished with exit code 0
    
    print(re.findall('z[ds]','ewzds')) 
    print(re.findall('z[cs]','ewz')) 
    
    
    D:python3.5python.exe D:/untitled/python3/day正则练习.py
    ['zd']
    ['zc']
    
    Process finished with exit code 0
    
    print(re.findall('zx|xz','zxssxzss'))
    print(re.findall('zxc|cxz','sdzxcscxzds'))
    
    D:python3.5python.exe D:/untitled/python3/lianxi.py
    ['zx', 'xz']
    ['zxc', 'cxz']
    
    Process finished with exit code 0
    
    print(re.findall('(asd)','asdasdasd'))
    print(re.findall('za','aszasdza'))
    print(re.findall('(za){2}',"zaza"))
    print(re.findall('a(12)|(23)c','a123c
    
    D:python3.5python.exe D:/untitled/python3/lianxi.py
    ['asd', 'asd', 'asd']
    ['za', 'za']
    ['za']
    [('12', '')]
    
    Process finished with exit code 0
    
    print(re.findall('a.c','a.csd'))
    print(re.findall(r'a\c','acd'))
    
    D:python3.5python.exe D:/untitled/python3/lianxi.py
    ['a.c']
    ['a\c']
    
    Process finished with exit code 0
    

     
    d  匹配任何十进制数;它相当于类 [0-9]。
    D  匹配任何非数字字符;它相当于类 [^0-9]。
    s  匹配任何空白字符;它相当于类  [ fv]。
    S  匹配任何非空白字符;它相当于类 [^ fv]。
    w  匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
    W  匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
    : 匹配一个单词边界,也就是指单词和空格间的位置。  单词中间的符号代表两个,两边代表两个
     就是用在你匹配整个单词的时候。 如果不是整个单词就不匹配。

    (r'd*','xin123456789')) #输出数字
    print(re.findall(r'D*','kai1234!@#$%45623')) #非数字
    print(re.findall(r's*','kai    5132')) #匹配所有的空格
    print(re.findall(r'S*','kai8465')) #匹配非空白字符串
    print(re.findall(r'w*','kai#2454#%^%$#')) #匹配任何数字,字符串
    print(re.findall(r'W*','kai^%$#5632')) #匹配任何非字符和数字
    print(re.findall(r'','asdadda')) #匹配一个单词边界,也就是指单词和空格键的位置
    print(re.findall(r'xin','xin,sad')) #匹配单词:
    

     re模块的内置功能:

    compile()

    编译正则表达式模式,返回一个对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)

    语法:

    re.compile(pattern,flags=0)

    pattern: 编译时用的表达式字符串。

    flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。常用的flags有:

    rr = 'kai xin is  sd sood gesd good '
    xx = re.compile(r'w*oow*')
    print(xx.findall(rr))
    
    D:python3.5python.exe D:/untitled/python3/day正则练习.py
    ['sood', 'good']
    
    Process finished with exit code 0
    

    re.I 使匹配对大小写都不敏感
    re.M 多行匹配,影响^ 和$
    re.S 使 .匹配包括换行在内的所有字符,每行都匹配
    re.L 做本地化识别(locale- aware)匹配
    re.U 根据Unicode 字符集解析字符,这个标志影响w W;B
    re.X 通过更灵活的格式以便将正则表达式写的更易于理解

    xin = re.findall('.','asd
    ds',re.S)
    print(xin)    #匹配所有字符包括换行符
    print (re.findall('.','sa
    as',re.M))
    print (re.findall('.','sa
    as',re.S))# 匹配任何字符包括换行符在内
    
    D:python3.5python.exe D:/untitled/python3/day正则练习.py
    ['a', 's', 'd', '
    ', 'd', 's']
    ['s', 'a', 'a', 's']
    ['s', 'a', '
    ', 'a', 's']
    
    Process finished with exit code 0
    

     search 浏览全部字符串,匹配第一个符合规则的字符串
    法:search:re.search(pattren,string,filsgs= 0)

    一旦匹配成功,就是一个match object 对象,

    而match object 对象拥有以下方法:

    group() 返回被 RE 匹配的字符串

    start() 返回匹配开始的位置

    end() 返回匹配结束的位置

    span() 返回一个元组包含匹配 (开始,结束) 的位置

    group() 返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串

    1. group()返回re整体匹配的字符串,

    2. group (n,m) 返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常

    3.groups() 方法返回一个包含正则表达式中所有小组字符串的元组,从 1 到所含的小组号,通常groups()不需要参数,返回一个元组,元组中的元就是正则表达式中定义的组。

     
    print(re.search('dcom','wee.4comsdda.5com').group())# 匹配数字后有com的
    print(re.search('dcom','ww.5comdsada.2com').group()) #5com 返回被RE匹配的字符串
    print(re.search('dcom','wdd.5comsads.2com').start()) #匹配开始的位置
    print(re.search('dcom','www.5comsa.2com').end())  #匹配结束的位置
    print(re.search('dcom','wdd.5comsdad.2com').span()) #匹配开始结束的位置
    xin = re.search('([d]*)([a-z]*)([d]*)','123dbc452').groups()
    print(xin)  # 返回一个包含正则式中所有字符串的元祖
    
     
    a = '123xin321'
    print(re.search("([d]*)([a-z]*)([d]*)",a).group(0))  #默认0匹配的全部租
    print(re.search('([d]*)([a-z]*)([d]*)',a).group(1)) #匹配第一个组
    print(re.search('([d]*)([a-z]*)([d]*)',a).group(2)) #匹配第二个组
    print(re.search('([d]*)([a-z]*)([d]*)',a).group(3)) #匹配第三个组
    
    分组:
    xin = 'guo kai xin hoaniubi 19'
    kai =re.search('(w+)',xin)
    print(kai.group())
    print(kai.groups())
    print(kai.groupdict())
    D:python3.5python.exe D:/untitled/python3/day正则练习.py
    guo
    ('guo',)
    {}
    
    
    ds = 'sdfghjz x cvbn msd fghjdcvbnm10'
    s = re.search('(w+).*(?P<name>d)$',ds)
    print(s.group())
    print(s.groups())   #()组
    print(s.groupdict())
    
    D:python3.5python.exe D:/untitled/python3/day正则练习.py
    sdfghjz x cvbn msd fghjdcvbnm10
    ('sdfghjz', '0')
    {'name': '0'}
    
    Process finished with exit code 0
    

    matoch 只匹配开头

    re.match(pattern,string,flags=0)
    flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小 多行匹配等
    print(re.match('XIN','XINxsss.dhsajk').group()) #区分大小写
    print(re.match('xin','Xinsdasd.dsad',re.I).group()) #加上I就不区分大小写
    
    D:python3.5python.exe D:/untitled/python3/day正则练习.py
    XIN
    Xin
    Process finished with exit code 0
    分组:
    xin = 'kai xin guo xiao huo zi'
    kai = re.match('kw+',xin)  
    print(kai.group())      #获取匹配开头的所有结果
    print(kai.groups())    #获取模型中匹配到的分组结果
    print(kai.groupdict()) #获取模型中匹配到的分组结果 # 执行结果: kai () {}
    有分组:
    为何要有分组?提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来)
    
    xin = 'kai xin guo xiao huo zi' 
    kai = re.match('k(w+)',xin) 
    print(kai.group())     #获取匹配开头的所有结果 
    print(kai.groups())   #获取模型中匹配到的分组结果 
    print(kai.groupdict()) #获取模型中匹配到的分组结果 
    #执行结果: kai ('ai',) {}
    
    kai = re.match('(k)(w+)',xin)#获取匹配开头的所有结果  
    print(kai.group()) 
    print(kai.groups()) 
    print(kai.groupdict()) 
    执行结果: kai ('k', 'ai') {}
    
    kai = re.match('(?P<n1>k)(?P<n2>w+)',xin)  
    print(kai.group()) 
    print(kai.groups()) 
    print(kai.groupdict())   #?p<n1>  代表gpoutdict中的key
    执行结果: 
    kai 
    ('k', 'ai') 
    {'n2': 'ai', 'n1': 'k'} 
    
    print(re.match('xin$','Xinsdasd.dsad',re.I))
    
    D:python3.5python.exe D:/untitled/python3/day正则练习.py
    None
    
    Process finished with exit code 0
    
    以***开始匹配,¥以***结尾的
    sum = re.match("(.*xin$)","xindffsfsdf.xin").group()
    print(sum)
    
    D:python3.5python.exe D:/untitled/python3/day正则练习.py
    xindffsfsdf.xin
    
    Process finished with exit code 0    这是个疑难杂症
    xin = 'guo4kai5xin'
    kai = re.sub('d+','xxx',xin)
    print(kai)
    打印结果
     
    guoxxxkaixxxxin
    

    sub:

    替换string中每一个匹配的子串后返回替换后的字符串

    语法re.sub(pattern,repl,steing,,max(0))

    subn:

    替换的次数

     

    xin = 'guo4kai5xin'
    new_str,count = re.subn('d+','xxx',xin)
    print(new_str,count)
    打印结果
    guoxxxkaixxxxin 2
    
    import re
    xin = re.sub('x.i','xin','I xi Z,I xi A I xi B')
    print(xin)
    print(re.sub('[1-3]','S','SSSS12346'))
    
    print(re.subn('k.i','xin','I kai A I kai B I kaiC'))
    print(re.subn('[1-3]','s','ss132456'))
    
    
    D:python3.5python.exe D:/untitled/python3/lianxi.py
    I xi Z,I xi A I xi B
    SSSSSSS46
    ('I xin A I xin B I xinC', 3)
    ('sssss456', 3)
    
    Process finished with exit code 0
    

    split:

    分割 切片函数。使用指定的正则规则在目标字符串中查找匹配的字符串,用它们作为分界,把字符串切片

     

    x = re.compile(r'd+')
    print(x.split('q1q2q3'))
    print(re.split('d','q1q2q3'))
    print(re.split('[a-z]','q1q2q3'))
    
    D:python3.5python.exe D:/untitled/python3/lianxi.py
    ['q', 'q', 'q', '']
    ['q', 'q', 'q', '']
    ['', '1', '2', '3']
    
    Process finished with exit code 0
    
    s = 'q1,q2,q3'
    print(re.split('/s*/s*',s))
    
    D:python3.5python.exe D:/untitled/python3/lianxi.py
    ['q1,q2,q3']
    
    Process finished with exit code 0
    又无分组:
    无分组
    xin = 'hello and xin aos erpi 20'
    kai = re.split('aw+',xin,)
    print(kai)
    kai = re.split('aw+',xin,1) #分割一次
    print(kai)
    打印结果
    ['hello ', ' xin ', ' erpi 20']
    ['hello ', ' xin aos erpi 20']
    有分组
    
    kai = re.split('(aw+)',xin,)
    print(kai)
    kai = re.split('(aw+)',xin,1)
    print(kai)
    kai = re.split('a(w+)',xin,1)
    print(kai)
    打印结果
    ['k', 'ai', ' xin guo xi', 'ao', ' huo zi']
    ['k', 'ai', ' xin guo xiao huo zi']
    ['k', 'i', ' xin guo xiao huo zi']
    

     

    findall()以列表形式返回所有匹配的字符串,可以获取字符串中所有匹配的字符串

     


     
    p = re.compile(r'd+')
    print(p.findall('one1two2three3four4')) #匹配所有的数字
    text = 'JGood is a handsome boy,he is,handsome and cool,clever,ane so on...'
    print(re.findall(r'w*oow',text)) #匹配前后都有字符,中间是00的
    print(re.findall(r'(w)*oo(w)*',text))  #表示子表达式
    
    
    D:python3.5python.exe D:/untitled/python3/lianxi.py
    ['1', '2', '3', '4']
    ['JGood', 'cool']
    [('G', 'd'), ('c', 'l')]
    
    Process finished with exit code 0
    有无分组
    n = re.findall('d+wd+','q2b3c4d5')
    print(n) #从前向后匹配 d 数字 w 字母
    n = re.findall('(d+)(w)*(d+)','q2b3c4d5')
    print(n)
    打印结果
    
    ['2b3', '4d5']
    [('2', 'd', '5')]
    
    kai = 'guo kaixin fe' # 默认的都是goups模式
    xin = re.findall('kw+',kai)
    print(xin)
    xin = re.findall('(kw+)',kai)
    print(xin)
    xin = re.findall('(k)(w+)',kai)
    print(xin)
    xin = re.findall('(k)(w+)(n)',kai)
    print(xin)
    xin = re.findall('(k)(w+(i))(n)',kai)
    print(xin)
    
    打印结果:
    ['kaixin']
    ['kaixin']
    [('k', 'aixin')]
    [('k', 'aixi', 'n')]
    [('k', 'aixi', 'i', 'n')]
    
    n = re.findall('(ddsa)*','as5dsangnb5dsaare')
    print(n)
    n = re.findall('(ddsa)+','as5dsangnb5dsaare')
    print(n)
    打印结果
    
    ['', '', '5dsa', '', '', '', '', '5dsa', '', '', '', '']
    ['5dsa', '5dsa']
    

     finditer 搜索string 返回一个顺序访问每一个匹配结果(Match对象)的迭代器  

    p = re.compile(r'd+')
    for i in p.finditer('q1,q2,q3'):
        print(i.group())
        
    D:python3.5python.exe D:/untitled/python3/lianxi.py
    1
    2
    3
    
    Process finished with exit code 0
    
    p = re.compile(r'd+')
    for i in p.finditer('q1,q2,q3'):
        print(i.span())
    
    D:python3.5python.exe D:/untitled/python3/lianxi.py
    (1, 2)
    (4, 5)
    (7, 8)
    Process finished with exit code 0
    

     

     

     

     

     

     

    
    
    
    
    
    
    
    
     
    
    
    
     
    
    
    
  • 相关阅读:
    原码、反码、补码,计算机中负数的表示
    java 解惑系列
    (转载) 深入JVM学习笔记-安全性
    理解Java对象序列化
    关于Arrays.asList 函数的一些 陷阱
    JAVA设计模式之单例模式 (转载)
    Educational Codeforces Round 76 D
    总结
    bzoj3531: [Sdoi2014]旅行 (树链剖分 && 动态开点线段树)
    bzoj3626: [LNOI2014]LCA (树链剖分)
  • 原文地址:https://www.cnblogs.com/guokaixin/p/5507034.html
Copyright © 2011-2022 走看看