zoukankan      html  css  js  c++  java
  • 正则表达式(Python3-re模块示例)

    1.常用的正则表达式

    '.'     默认匹配除
    之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
    '^'     匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","
    abc
    eee",flags=re.MULTILINE)
    '$'     匹配字符结尾, 若指定flags MULTILINE ,re.search('foo.$','foo1
    foo2
    ',re.MULTILINE).group() 会匹配到foo1
    '*'     匹配*号前的字符0次或多次, re.search('a*','aaaabac')  结果'aaaa'
    '+'     匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
    '?'     匹配前一个字符1次或0次 ,re.search('b?','alex').group() 匹配b 0次
    '{m}'   匹配前一个字符m次 ,re.search('b{3}','alexbbbs').group()  匹配到'bbb'
    '{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
    '|'     匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
    '(...)' 分组匹配, re.search("(abc){2}a(123|45)", "abcabca456c").group() 结果为'abcabca45' 
    
    'A'    只从字符开头匹配,re.search("Aabc","alexabc") 是匹配不到的,相当于re.match('abc',"alexabc") 或^
    ''    匹配字符结尾,同$ 
    'd'    匹配数字0-9
    'D'    匹配非数字
    'w'    匹配[A-Za-z0-9]
    'W'    匹配非[A-Za-z0-9]
    's'     匹配空白字符、	、
    、
     , re.search("s+","ab	c1
    3").group() 结果 '	'
    '(?P<name>...)' 分组匹配

     

     

    2.re模块

    re.match(pattern, string[, flags]) 从头开始匹配
    re.search(pattern, string[, flags]) 匹配包含
    re.findall(pattern, string) 把所有匹配到的字符放到以列表中的元素返回
    re.split(pattern, string[, maxsplit=0) 以匹配到的字符当做列表分隔符
    re.sub(pattern, replace, string[, count=0] 匹配字符并替换
    re.fullmatch 全部匹配

    2.1 简单例子

    >>> import re
    >>> s = 'abc1d3e'
             re.match
    >>> print(re.match('[0-9]', s))
    None
    >>> re.match('[0-9]', '1bdfd')
    <_sre.SRE_Match object; span=(0, 1), match='1'>
             re.search
    >>> re.search('[0-9]', s)
    <_sre.SRE_Match object; span=(3, 4), match='1'>

    >>> re.search('[0-9]', s).group()
    '1'

    # span是类似于切片的索引
             re.findall
    >>> re.findall('[0-9]', s)
    ['1', '3']
              re.split
    >>> re.split('d', s)
    ['abc1', '3e']>>> s2 = 'alex99jack88rain77jinxin50'
    >>> re.split('d+', s2)
    ['alex', 'jack', 'rain', 'jinxin', '']
              re.findall
    >>> s1 = 'aabbaa123'
    >>> re.findall('a', s1)
    ['a', 'a', 'a', 'a']

    >>> re.findall('d+', s2)
    ['99', '88', '77', '50']

               re.sub
    >>> re.sub('a', 'c', s1)
    'ccbbcc123'

    3.其他正则表达式

    分组匹配

    >>> import re
    >>> s='alex123'
    >>> re.search('([a-z]+)([0-9]+)', s).group()
    ('alex123')
    >>> re.search('([a-z]+)([0-9]+)', s).groups()
    ('alex', '123')
    >>> re.search('d', s)
    <_sre.SRE_Match object; span=(4, 5), match='1'>
    >>> re.search('d+', s)
    <_sre.SRE_Match object; span=(4, 7), match='123'>
    >>> re.search('D+', s)
    <_sre.SRE_Match object; span=(0, 4), match='alex'>

    另外一种分组匹配

    >>> s1 = '130704200005250613'
    >>> re.search('(?P<province>d{3})(?P<city>d{3})(?P<born_year>d{4})', s1).groupdict()
    {'province': '130', 'city': '704', 'born_year': '2000'}

    复杂一点的re.sub

    >>> re.sub('d+','_', s3)
    'alex_jack_rain_\jinxin_|mac-oldboy'
    >>> re.sub('d+','_', s3, count=2)
    'alex_jack_rain77\jinxin50|mac-oldboy'

    re.split

    >>> s2 = 'alex99jack88rain77jinxin50#mac-oldboy'
    >>> re.split('d+|#|-', s2)
    ['alex', 'jack', 'rain', 'jinxin', '', 'mac', 'oldboy']
    >>> s4 = '9-2*5/3+73*99/4*2998+10*568/14'
    >>> re.split('[-*/+]', s4)
    ['9', '2', '5', '3', '7x03', '99', '4', '2998', '10', '568', '14']
    >>> re.split('[-*/+]', s4, maxsplit=2)
    ['9', '2', '5/3+7x03*99/4*2998+10*568/14']

    re.fullmatch

     
    >>> re.fullmatch('alex123', 'alex123')
    <_sre.SRE_Match object; span=(0, 7), match='alex123'>
    >>> re.fullmatch('w+@w+.(com|cn|edu)', 'alex@oldboyedu.com')
    <_sre.SRE_Match object; span=(0, 18), match='alex@oldboyedu.com'>

    re.compile(pattern[,flags])根据包含正则表达式的字符串创建模式对象

    >>> pattern = re.compile('w+@w+.(com|cn|edu)')
    # 如果需要多次的匹配,建议首先把pattern用compile方法转化,这样解释器就不需要每次都转化了。
    >>> pattern.fullmatch('alex@oldboyedu.cn')
    <_sre.SRE_Match object; span=(0, 17), match='alex@oldboyedu.cn'>

    4.Flags标志符

    • re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
    • M(MULTILINE): 多行模式,改变'^'和'$'的行为
    • S(DOTALL): 改变'.'的行为,make the '.' special character match any character at all, including a newline; without this flag, '.' will match anything except a newline.
    • X(re.VERBOSE) 可以给你的表达式写注释,使其更可读,下面这2个意思一样
    a = re.compile(r"""d + # the integral part
                    . # the decimal point
                    d * # some fractional digits""", 
                    re.X)
    
    b = re.compile(r"d+.d*")

    其他的例子

    >>> re.search('a', "Alex", re.I)
    <_sre.SRE_Match object; span=(0, 1), match='A'>
    
    >>> re.search('foo.$', 'foo1
    foo2
    ')
    <_sre.SRE_Match object; span=(5, 9), match='foo2'>
    >>> re.search('foo.$', 'foo1
    foo2
    ', re.M)
    <_sre.SRE_Match object; span=(0, 4), match='foo1'>
    
    >>> print(re.search('.', '
    '))
    None
    >>> re.search('.', '
    ', re.S)
    <_sre.SRE_Match object; span=(0, 1), match='
    '>
    
    >>> print(re.search('.  #test', 'alex'))
    None
    >>> re.search('.   #test', 'alex', re.X)
    <_sre.SRE_Match object; span=(0, 1), match='a'>
  • 相关阅读:
    104.Maximum Depth of Binary Tree
    103.Binary Tree Zigzag Level Order Traversal
    102.Binary Tree Level Order Traversal
    101.Symmetric Tree
    100.Same Tree
    99.Recover Binary Search Tree
    98.Validate Binary Search Tree
    97.Interleaving String
    static静态初始化块
    serialVersionUID作用
  • 原文地址:https://www.cnblogs.com/haoqirui/p/9969730.html
Copyright © 2011-2022 走看看