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

    元字符  .   *   +   ?   ^   $   { }     [ ]     -        

    .  匹配除了/n之外的任意一个字符

    * 匹配*前面的单个字符任意次,即[0,+]

    + 匹配+前面的单个字符一次或多次,即[1,+∞]

    ? 匹配?前面的单个字符0次或一次,即[0,1]

    ^ 匹配以^后字符串整体开头的

    $ 匹配以$前字符串整体结尾的

    { }匹配前面单个字符多次,{0,}相当于*,{1,}相当于+,{0,1}相当于?,{n}表示匹配n次,{m,n}表示最少匹配m次最多匹配n次(m<n)

    (*、+、?、{ }单独使用都是贪婪匹配,即最可能多的匹配,在后面再加上?会变成惰性匹配,即尽可能少的匹配)

    [ ]匹配字符集中的任意一个元素,在字符集中,除了-(表示两者之间)、^(表示非)和(转义)有特殊含义 ,其他字符都表示普通字符,例如逗号就表示一个字符

    |   匹配|前面或后面字符串整体

    d  匹配任何十进制数,相当于[0-9]

    D  匹配任何非0-9字符,相当于[^0-9]

    s  匹配任何空白字符,相当于[ fv]

    S  匹配任何非空白字符,相当于[^ fv]

    w  匹配任何字母和数字字符,相当于[a-zA-Z0-9]

    W  匹配任何非字母和数字字符,相当于[^a-zA-Z0-9]

      匹配一个特殊字符

    .、*、^、$  使后面的字符表示本来的意义,不再表示元字符所代表的的特殊意义

    import re
    print(re.findall('al.x','12alexh'))
    print(re.findall('alex*','12aleh'))
    print(re.findall('alex+','12aleh'))
    print(re.findall('alex?','12aleh'))
    print(re.findall('^alex','alhjw'),re.findall('^alex','alexhjw'))
    print(re.findall('alex$','wertalex'))
    print(re.findall('alex{2,5}','alexxxxh'),re.findall('alex{2,5}?','alexxxxh'))
    print(re.findall('al[e*g]x','alexlal*xg'))
    print(re.findall('al[a-g]x','alexalwx'),re.findall('al[^a-g]x','alexalwx'),re.findall('al[^ag]x','alexalwx'))
    print(re.findall('d+','2+3*4-(26-7)'),re.findall('D+','2+3*4-(26-7)'))
    print(re.findall('s+','hello world'),re.findall('S+','hello world'))
    print(re.findall('w+','12@f
    lh58'),re.findall('W+','12@f
    lh58'))
    print(re.findall('www.baidu','www.baidu'),re.findall('www*baidu','www*baidu'))
    print(re.findall('d\\k','12dkc2f')) #d\\k通过python解释器解释之后,传给re模块的是\k,re将第一个解释为转义,余下的k用作匹配

    输出

    ['alex']
    ['ale']
    []
    ['ale']
    [] ['alex']
    ['alex']
    ['alexxxx'] ['alexx']
    ['alex', 'al*x']
    ['alex'] ['alwx'] ['alex', 'alwx']
    ['2', '3', '4', '26', '7'] ['+', '*', '-(', '-', ')']
    [' '] ['hello', 'world']
    ['12', 'f', 'lh58'] ['@', '
    ']
    ['www.baidu'] ['www*baidu']

    () 进行分组

    print(re.findall('www.(baidu|163).com','www.baidu.com'))  #['baidu']
    print(re.findall('www.(?:baidu|163).com','www.baidu.com'))  #['www.baidu.com']

    使用()进行分组匹配时,优先显示匹配到的内容

    在括号内要匹配的字符串之前加?:,表示去掉优先显示,即显示所有的结果

    findall将所有符合条件的匹配结果放在一个列表

    search匹配到一个就停止,且结果为一个对象,需要通过对象的group( )方法取值

    match类似search,但是match只匹配在开头出现的

    三个的使用方法都类似re.findall('匹配规则','匹配字符串')

    (?P<name>'匹配规则'):表示将匹配规则命名为name,后续可通过group(name)取结果

    print(re.search('(?P<name>[a-z]+)(?P<age>d+)','alex35Alice28Bob30').group())  #输出alex35,group不加参数默认输出第一个即group(0)
    print(re.search('(?P<name>[a-z]+)(?P<age>d+)','alex35Alice28Bob30').group('name'))  #输出alex
    print(re.search('(?P<name>[a-z]+)(?P<age>d+)','alex35Alice28Bob30').group('age'))  #输出35
    print(re.match('a+ex','aaex12').group(),re.match('a+ex','1aaex12'))  #输出aaex None


    split字符串分割,分割结果不包含用来分割的字符,使用方法re.split('分割符','处理字符串')

    print(re.split('[ ,]','hi,nice to meet you'))  #输出['hi', 'nice', 'to', 'meet', 'you']
    print(re.split('[ab]','8an8ab9jfahb'))# ['8','n8','','9jf','h','']  #输出['8', 'n8', '', '9jf', 'h', '']

    第一个表示以空格或逗号分割

    第二个表示以a或b分割,分割过程如下

    原字符串中第2位的a将原字符串分割为8和n8ab9jfahb,取得第一个分割结果8

    n8ab9jfahb中第3位的a将字符串分割为n8和b9jfahb,取得第二个分割结果n8

    b9jfahb中第一位的b将字符串分割为''(由于b左边为空)和9jfahb,取得第三个分割结果''

    9jfahb中第四位的a将字符串分割为9jh和hb,取得第四个分割结果9jh

    hb中第二位的b将字符串分割为h和''(由于b右边为空),取得第五、六个分割结果h、''

    sub替换,使用方法re.sub('被替换字符','替换字符','处理字符串'[,替换次数]),如果没有替换次数默认替换所有

    subn替换和替换次数,使用方法re.subn('被替换字符','替换字符','处理字符串'),返回一个元组,第一个元素为替换后的结果,第二个元素为替换次数,

    print(re.sub('d+','A','h3e34ff7'),re.sub('d+','A','h3e34ff7',2))  #hAeAffA hAeAff7
    print(re.subn('d+','A','h3e34ff7'))  #('hAeAffA', 3)

    compile事先编译匹配规则

    com=re.compile('a+b')
    print(com.findall('2aabcde'))  #输出['aab']
    print(com.match('abcde').group())  #输出ab
    print(com.sub('F','2abc78aabcd'))  #输出2Fc78Fcd

    finditer 将匹配结果放入一个迭代器,再通过迭代器的next方法取值

    s=re.finditer('s+','1ss34sssdaes')
    print(s)  #输出<callable_iterator object at 0x0000000001E320F0>,表示结果为一个迭代器
    print(next(s))  #输出<re.Match object; span=(1, 3), match='ss'>,表示结果为一个对象,且匹配到的为ss
    print(next(s).group())  #输出sss,通过对象的group()方法取到第二次next的值sss
  • 相关阅读:
    句法分析树标注集
    LaTeX入门教程(二)
    LaTeX入门教程(一)
    汉语词性对照表[北大标准/中科院标准]
    Python版C语言词法分析器
    QT5.4 计算器程序 打包&发布,解决dll的最新解决方案
    解决Android SDK Manager更新(一个更新Host的程序的原理实现和源码)
    增加个人博客地址,欢迎访问
    Matlab R2012b启动出现License Manager Error -15
    C++中二维数组的动态创建与处理
  • 原文地址:https://www.cnblogs.com/Forever77/p/9978786.html
Copyright © 2011-2022 走看看