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'>
  • 相关阅读:
    opencv视屏流嵌入wxpython框架
    Linux下makefile学习
    关于pyinstall打包时的依赖问题
    python文件结构与import用法
    python3+dlib人脸识别及情绪分析
    慕课学习--DNS的作用
    力扣leetcode11. 盛最多水的容器
    力扣leetcode5.最长回文子串
    力扣leetcode1190. 反转每对括号间的子串
    基于Ubuntu1604+ROS-kinetic+roscpp的激光雷达定位算法从零开始移植
  • 原文地址:https://www.cnblogs.com/haoqirui/p/9969730.html
Copyright © 2011-2022 走看看