zoukankan      html  css  js  c++  java
  • Python模块-re模块

    re正则匹配,如果没有匹配到就返回None,匹配结果加上.group()就会以字符串形式返回匹配结果

    • re的匹配语法

    re.match()     从头开始匹配

    >>> re.match('ab','abcdefg')
    <_sre.SRE_Match object; span=(0, 2), match='ab'>
    >>> re.match('ab','cabdefg')
    

    只能从左边第一个开始匹配

    re.search()    匹配包含

    >>> re.search('ab','abcdefg')
    <_sre.SRE_Match object; span=(0, 2), match='ab'>
    >>> re.search('ab','cabdefg')
    <_sre.SRE_Match object; span=(1, 3), match='ab'>
    

    从字符串中的任意位置开始匹配

    re.match()和re.search()方法只能匹配一次,如果要匹配全部的结果,可以使用re.findall()

    re.findall()   把所有匹配到的字符放入列表中

    >>> re.findall('ab','abcdefabcdefab')
    ['ab', 'ab', 'ab']
    

    re.split()     以匹配到的字符当做列表分隔符,来把元素分开

    >>> re.split('+','ab+c+d+ef+gh')
    ['ab', 'c', 'd', 'ef', 'gh']
    

    因为“+”为匹配规则,所以需要用转义符把“+”转义为普通的“+”

    re.sub()       匹配字符并替换

    >>> re.sub('.','5','org.cn.net.com.gov')
    'org5cn5net5com5gov'
    >>> re.sub('.','5','org.cn.net.com.gov',count=2)
    'org5cn5net.com.gov'
    

    count为替换的次数

    re.fullmatch()    匹配全部

    >>> re.fullmatch('python','python')
    <_sre.SRE_Match object; span=(0, 6), match='python'>
    

    要整个字符串完全匹配

    re.compile(pattern, flags=0)  匹配规则

    >>> test = re.compile('[TH]+',flags=re.I)
    >>> test.search('python').group()
    'th'
    
    • re常用的表达式规则

    '.'     默认匹配除 之外的任意一个字符

    >>> re.match('.','python')
    <_sre.SRE_Match object; span=(0, 1), match='p'>
    >>> re.match('.','java')
    <_sre.SRE_Match object; span=(0, 1), match='j'>
    >>> re.findall('.','ja
    va')
    ['j', 'a', 'v', 'a']
    

    '^'和'A'     从字符串开头开始匹配

    >>> re.match('p','python')
    <_sre.SRE_Match object; span=(0, 1), match='p'>
    >>> re.search('^p','python')
    <_sre.SRE_Match object; span=(0, 1), match='p'>
    >>> re.search('Ap','python')
    <_sre.SRE_Match object; span=(0, 1), match='p'>
    

    以上三种匹配都是只从左边第一个开始匹配

    '$'和''      从字符串结尾开始匹配

    >>> re.search('on$','python')
    <_sre.SRE_Match object; span=(4, 6), match='on'>
    >>> re.search('on','python')
    <_sre.SRE_Match object; span=(4, 6), match='on'>
    

    '*'     匹配*号前的字符0次或多次

    >>> re.search('ab*','abbbcabbcd')
    <_sre.SRE_Match object; span=(0, 4), match='abbb'>
    >>> re.search('(ab)*','ababababcabbcd')
    <_sre.SRE_Match object; span=(0, 8), match='abababab'>
    >>> re.search('f*','ababababcabbcd')
    <_sre.SRE_Match object; span=(0, 0), match=''>
    

    f没有匹配到,返回了空,而不是None

    '+'     匹配前一个字符1次或多次

    >>> re.search('ab+','abbbcabbcd')
    <_sre.SRE_Match object; span=(0, 4), match='abbb'>
    >>> re.search('(ab)+','ababababcabbcd')
    <_sre.SRE_Match object; span=(0, 8), match='abababab'>
    >>> re.search('f+','ababababcabbcd')
    

    f没有匹配到,所以返回None

    '?'     匹配前一个字符1次或0次

    >>> re.search('ab?','abbbbc')
    <_sre.SRE_Match object; span=(0, 2), match='ab'>
    >>> re.search('d?','abbbbc')
    <_sre.SRE_Match object; span=(0, 0), match=''>
    

    '[...]'   匹配[]中的字符,[0-9]为数字,[a-z]为全部小写字母,[A-Z]为全部大写字母,[A-Za-z0-9]为全部大小写字母和数字

    >>> re.findall('[pto]','python')
    ['p', 't', 'o']
    >>> re.findall('[a-z]','python')
    ['p', 'y', 't', 'h', 'o', 'n']
    >>> re.findall('[A-Z]','PyThoN')
    ['P', 'T', 'N']
    >>> re.findall('[0-9]','sch01ar')
    ['0', '1']
    >>> re.findall('[A-Za-z0-9]','PyTh0n!@#')
    ['P', 'y', 'T', 'h', '0', 'n']
    

    '[^...]'  匹配不在[]中的字符

    >>> re.findall('[^pto]','python')
    ['y', 'h', 'n']
    >>> re.findall('[^A-Z]','PyThoN')
    ['y', 'h', 'o']
    >>> re.findall('[^a-z]','PyThoN')
    ['P', 'T', 'N']
    >>> re.findall('[^0-9]','sch01ar')
    ['s', 'c', 'h', 'a', 'r']
    >>> re.findall('[^a-zA-Z0-9]','sch01ar')
    []
    

    '{m}'   匹配前一个字符m次

    >>> re.search('[0-9]{3}','12345')
    <_sre.SRE_Match object; span=(0, 3), match='123'>
    

    匹配数字3次

    '{n,m}' 匹配前一个字符n到m次

    >>> re.findall('[0-9]{2,4}','abc1abcd12ab123abcde1234abcdef12345abc')
    ['12', '123', '1234', '1234']
    

    匹配2到4位的0-9的数字

    '|'     匹配|左或|右的字符

    >>> re.findall('h|n','pythonandphp')
    ['h', 'n', 'n', 'h']
    >>> re.findall('h|b','pythonandphp')
    ['h', 'h']
    >>> re.findall('b|h','pythonandphp')
    ['h', 'h']
    >>> re.search("abc|ABC","ABCBabcCD").group()
    'ABC'
    

    |右边优先于左边

    '(...)'  分组匹配

    >>> re.search("(abc){2}a(123|45)", "abcabca456c").group()
    'abcabca45'
    >>> re.search("(abc){2}a(123|45)", "abcabca456c").groups()
    ('abc', '45')
    

    groups()返回为元组

    '(?P<name>...)'   分组匹配

    >>> re.search("(?P<year>[0-9]{4})(?P<month>[0-9]{2})(?P<day>[0-9]{2})",'19930519').groupdict()
    {'year': '1993', 'day': '19', 'month': '05'}
    

    groupdict()以字典形式返回

    'd'    匹配数字0-9

    >>> re.findall("d", "abc123abc456abc")
    ['1', '2', '3', '4', '5', '6']
    >>> re.findall("d+", "abc123abc456abc")
    ['123', '456']
    

    'D'    匹配非数字

    >>> re.findall("D+", "abc123abc456abc")
    ['abc', 'abc', 'abc']
    

    'w'    匹配[A-Za-z0-9]

    >>> re.findall("w+", "ab-c12*3abc#456")
    ['ab', 'c12', '3abc', '456']
    

    'W'    匹配非[A-Za-z0-9],也可以匹配空白字符、 、 、

    >>> re.findall("W+", "ab-c12*3abc#456")
    ['-', '*', '#']
    

    's'     匹配空白字符、 、 、

    >>> re.findall("s+", "ab bc 
    def	wed
    123")
    [' ', ' 
    ', '	', '
    ']
    

    'S'   匹配非空白字符、 、 、

    >>> re.findall("S+", "ab bc 
    def	wed
    123")
    ['ab', 'bc', 'def', 'wed', '123']
    
    • Flags标志位

    flags标志位,用于控制正则表达式的匹配方式

    括号内是完整写法

    I(IGNORECASE): 忽略大小写

    >>> re.findall("[a-z]", "Sch01aR",re.I)
    ['S', 'c', 'h', 'a', 'R']
    >>> re.findall("[a-z]", "Sch01aR",re.IGNORECASE)
    ['S', 'c', 'h', 'a', 'R']
    

    M(MULTILINE): 多行模式,改变'^'和'$'匹配开头结尾的行为

    >>> re.search('[ef]+','abc
    efg
    hij',flags=re.M).group()
    'ef'
    >>> re.search('[ef]+','abc
    efg
    hij',flags=re.MULTILINE).group()
    'ef'
    

    S(DOTALL): 改变'.'的行为,也能匹配

    >>> re.search('.+','abc
    efg
    hij',flags=re.S).group()
    'abc
    efg
    hij'
    >>> re.search('.+','abc
    efg
    hij',flags=re.DOTALL).group()
    'abc
    efg
    hij'
    

    X(VERBOSE): 给匹配规则加上注释

    >>> re.search('[0-9]+ #匹配一个或多个0-9的数字','abc123cde456fgh',re.X).group()
    '123'
    >>> re.search('[0-9]+ #匹配一个或多个0-9的数字','abc123cde456fgh',re.VERBOSE).group()
    '123'
    
  • 相关阅读:
    SQLite剖析之异步IO模式、共享缓存模式和解锁通知
    SQLite剖析之动态内存分配
    SQLite剖析之锁和并发控制
    SQLite剖析之临时文件、内存数据库
    SQLite剖析之数据类型
    关于Docker目录挂载的总结(一)
    docker常用命令
    玩转docker(一)
    go hello
    术语“go”不被识别为cmdlet,函数,脚本文件或可操作程序的名称
  • 原文地址:https://www.cnblogs.com/sch01ar/p/8445772.html
Copyright © 2011-2022 走看看