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

    re模块

    正则表达式就是字符串的的匹配规则。

    常用的规则

    # 匹配规则
    # '.'     默认匹配除
    之外的任意一个字符,若指定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>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city")
    #  结果{'province': '3714', 'city': '81', 'birthday': '1993'}

    匹配规则操作:

    # 6.匹配规则的操作
    # '.'操作
    print('.:', re.match('.', '12abc'))  # 1个任意字符
    print('.:', re.match('..', '12abc'))  # 2个任意字符
    # '^'
    print('^:', re.search('^a', 'abc'))  # a开头
    print('^:', re.search('^ab', 'abc'))  # ab开头
    # '$'
    print('$:', re.search('b$', '12abb'))  # 匹配以b结尾
    # '*'
    print('*:', re.search('a*', 'ABC'))   # 匹配a字符的0次或多次
    print('*:', re.search('a*', 'aaaab3'))   # 匹配a字符的0次或多次
    print('*:', re.search('ab*', 'aaab'))   # 匹配ab字符的0次或多次
    # '+'
    print('+:', re.search('ab+', 'ABC'))   # 匹配b字符的0次或多次
    print('+:', re.search('ab+', 'aaaabbbbb'))   # 匹配ab字符的0次或多次
    print('+:', re.search('ab+', 'aaabaaaa'))   # 匹配ab字符的0次或多次
    # '?'
    print('?:', re.search('ab?', 'ABC'))   # 匹配b字符的0次或1次
    print('?:', re.search('ab?', 'aaaabbbbb'))   # 匹配ab字符的0次或1次
    # {m}
    print('m:', re.search('a{2}', 'ABC'))   # 匹配a字符的2次
    print('m:', re.search('a{2}', 'aaaabbbbb'))   # 匹配a字符的2次
    print('m:', re.search('a{2}', 'addaadbb'))   # 匹配a字符的2次
    print('m:', re.search('.{2}', 'addaadbb'))  # 匹配任意字符2次
    print('m:', re.search('[0-9]{2}', 'addaad23bb'))  # 匹配任意数字2次
    # {n,m}
    # [0-9][a-z]
    print('n-m:', re.search('[a-z]{1,2}', 'a2blex'))  # 匹配[a-z]字符的1~10次
    
    # | or关系
    print('|', re.search('[a|A]lex', 'alex'))
    print('|', re.search('[a|A]lex', 'Alex'))
    # 分组匹配
    print('分组:', re.search('([a-z]+)([0-9]+)', 'abc123').groups())

    分组匹配:

    # 分组匹配 '(?P<name>...)'
    s = '1307042000005250613'
    
    res = re.search('(?P<province>d{3})(?P<city>d{3})(?P<born_year>d{4})', s).groups()
    res2 = re.search('(?P<province>d{3})(?P<city>d{3})(?P<born_year>d{4})', s)
    
    print(res)  # 输出组
    print(res2.groupdict())  # 生成字典

    匹配语法:

    # 匹配语法:
    # re.match 从头开始匹配
    # re.search 匹配包含
    # re.findall 把所有匹配到的字符放到以列表中的元素返回
    # re.split 以匹配到的字符当做列表分隔符
    # re.sub 匹配字符并替换
    # re.fullmatch 全部匹配

    re.match(pattern,string,flags=0)

    # 1.match 操作 re.match(pattern, string, flags=0)
    # 下面返回None
    s = 'abc1d3e'
    print(re.match('[0-9]', s))  # 从头开始匹配
    # 判断第一行第一个值必须是数字。
    # 匹配到1,返回
    s2 = '1a1b'
    print(re.match('[0-9]', s2))

    re.search(pattern,string,flags=0)

    # 2.search 操作 re.search(pattern, string, flags=0)
    # 开头不是数字,从字符串中搜索,匹配到1
    s3 = 'abc1d3e'
    print(re.search('[0-9]', s3))  # 搜索字符串,找到1个就返回

    re.search 进行分组操作

    操作注意:

    为了避免匹配报错,可以先拿到匹配结果再进行分组操作

    # 4.通过search 匹配并拿到匹配后的结果
    s5 = 'abc1d3e'
    res = re.search('[0-9]', s5) # 把结果存到res变量
    if res: 
        print('serach_res:', res.group())  # 进行分组操作

    re.findall(pattern,string,flags=0)

    # 3.findall 操作
    # 如果想找到所有的数字,返回列表
    s4 = 'abc1d3e'
    print(re.findall('[0-9]', s4))  # 搜索字符串,找到所有符合要求的值

    re.split(pattern,string,maxsplit=0,flags=0)

    # re.split 划分
    s = 'alex22jack23rain32jinxin50'
    print(re.split('d+', s))   # 过滤所有的名字
    print(re.findall('d+', s))  # 过滤所有的年龄
    s3 = '1-2*4/45+2'
    print(re.split('[-+*/]',s3))
    print(re.split('[-+*/]',s3,maxsplit=2))

    re.sub(pattern,repl,string,count=0,flags=0)

    # re.sub
    print(re.sub('d+', '_', s))  # 匹配并替换内容
    print('re.sub', re.sub('d+', '|', 'alex22wupeiqi33oldboy55',count=2))

    re.fumatch(pattern,repl,string,count=0,flags=0)

    # re.fullmatch
    # 整个字符串匹配成功就返回er对象,否则返回None
    print(re.fullmatch('abc', 'abc'))
    # re.fullmatch 匹配邮箱
    print(re.fullmatch('w+.w+.com', 'www.baidu.com'))

    re.compile(pattern,flags=0)

    # re.compile
    # 用法
    # 1.先把规则写好返回一个规则表达式对象
    pattern = re.compile('w+@w+.(com|cn|edu)')  # 先定义好匹配规则
    # 2.调用时直接可以使用
    print(pattern.fullmatch('abc@oldouyedu.com'))

    Flags操作:

    #  Flags标识符
    # 1.re.I 忽略大小写
    print(re.search('a','abc'))  #匹配到'a'
    print(re.search('a','ABC'))  #匹配不到'a'
    print(re.search('a','ABC',re.I))  #匹配到'A'
    
    # 2.多行模式 re.MULTILINE
    print(re.search('foo.$', 'foo1
    foo2
    '))  # 匹配到foo2
    print(re.search('foo.$', 'foo1
    foo2
    ', re.MULTILINE))  # 匹配到foo2
    
    # 3.re.S
    print(re.search('.', '
    '))
    print(re.search('.', '
    ', re.S))
    
    # 4.re.VERBOSE  # 可以让匹配规则换行,便于添加注释
    a = re.compile(r"""d+   # 匹配数字部分
                   .        # 匹配'.'字符
                   d* """,  # 匹配数字部分
                   re.X)
    # 普通写法
    b = re.compile(r"d+.d*")
    
    print(a.search('12.34'))
    print(b.search('12.34'))
  • 相关阅读:
    Devexpress根据条件单元格变色以及根据条件设置单元格可编辑-记录
    批量更新事物加回滚
    批量更新
    Devexpress GridControl无限高度惹得祸
    C# 多语言国际化问题中的 CultureInfo
    配置linux服务器的防火墙,以CENTOS 为例(转载)
    关于Java的程序运行提醒
    用Eclipse跑Hadoop程序的注意事项
    Hadoop平台-错误收集附解决方案!
    unity3d之物体克隆
  • 原文地址:https://www.cnblogs.com/AYxing/p/8719526.html
Copyright © 2011-2022 走看看