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'
    
  • 相关阅读:
    姐姐的vue(1)
    LeetCode 64. Minimum Path Sum 20170515
    LeetCode 56. 56. Merge Intervals 20170508
    LeetCode 26. Remove Duplicates from Sorted Array
    LeetCode 24. Swap Nodes in Pairs 20170424
    LeetCode 19. Remove Nth Node From End of List 20170417
    LeetCode No.9 Palindrome Number 20170410
    LeetCode No.8. String to Integer (atoi) 2017/4/10(补上一周)
    LeetCode No.7 Reverse Integer 2017/3/27
    LeetCode No.4 Median of Two Sorted Arrays 20170319
  • 原文地址:https://www.cnblogs.com/sch01ar/p/8445772.html
Copyright © 2011-2022 走看看