• re模块


    原文:https://www.cnblogs.com/schut/p/8439225.html

    1、什么是re模块?

      正则表达式就是字符串的匹配规则,在多数编程语言里都有相应的支持,python里对应的模块是re。

    2、常用匹配规则:

     
    '.'     默认匹配除
    之外的任意一个字符,若指定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'}
     

    3、re的匹配语法有以下几种

      re.match  从头开始匹配

      re.search 匹配包含

      re.findall 把所有匹配到的字符放到列表中并返回列表

      re.split 以匹配到的字符当作列表分隔符

      re.sub 匹配字符并替换

      re.fullmatch 全部匹配

    4、re的匹配语法1实例

     
    #!/usr/bin/env python3
    #-*- coding:utf-8 -*-
    # write by congcong
    
    import re
    # 正则表达式就是字符串的匹配规则,在多数编程语言里都有相应的支持,python里对应的模块是re
    s = 'abc123d45'
    # re.match(pattern, string, flags=0) 从头开始匹配,只匹配第一个
    '''
    pattern 正则表达式  pattern 正则表达式  flags 标志位,用于控制正则表达式的匹配方式
    '''
    print(re.match('[0-9]',s)) # 因为第一个是’a‘所以没有匹配到
    print(re.match('[0-9]','15abc234')) # <_sre.SRE_Match object; span=(0, 1), match='1'>
    
    # re.search() 遇到符合要求的就返回,不再继续向后找
    print(re.search('[0-9]','ab12c3d')) # <_sre.SRE_Match object; span=(2, 3), match='1'>
    # 先判断是否匹配到,是的话 通过re.search().group() 返回匹配到的值
    
    # re.findall() 全局查找,有多少符合返回多少,以列表的形式返回
    print(re.findall('[0-9]','a1b2c3d4')) # ['1', '2', '3', '4']
    
    #  '.'  默认匹配除
    之外的任意一个字符
    print(re.match('.','abc12d')) # <_sre.SRE_Match object; span=(0, 1), match='a'>
    print(re.match('..','abc12d')) # <_sre.SRE_Match object; span=(0, 2), match='ab'>
    print(re.search('.','ab12cd')) # <_sre.SRE_Match object; span=(0, 1), match='a'>
    
    # ' ^ ' 匹配字符开头
    print(re.match('^a','ab12cd')) # <_sre.SRE_Match object; span=(0, 1), match='a'>
    print(re.match('^ab','ab12cd')) # <_sre.SRE_Match object; span=(0, 2), match='ab'>
    print(re.search('^ab','ab12cd')) # <_sre.SRE_Match object; span=(0, 2), match='ab'>
    
    #  '$' 匹配字符结尾
    print(re.match('d$','ab12cd'))# 无法获取
    print(re.search('d$','ab12cd')) # <_sre.SRE_Match object; span=(5, 6), match='d'>
    print(re.search('cd$','ab1cd2cd')) # <_sre.SRE_Match object; span=(6, 8), match='cd'>
    
    # '*' 匹配*号前的字符0次或多次
    print(re.match('d*','ad123dd')) # 没有匹配到
    print(re.search('ab*','a123abv').group()) # a
    print(re.search('a*','aaaabac').group()) # aaaa
    
    #  '+' 匹配前一个字符1次或多次
    print(re.findall("ab+","ab+cd+abb+bba") ) # ['ab', 'abb']
    print(re.findall('ab+','aabadfbab')) # ['ab', 'ab']
    
    #  '?' 匹配前一个字符1次或0次
    print(re.search('a?','alaex').group())  # a
    
    #  '{m}'匹配前一个字符m次
    print(re.search('b{3}','alexbbbs').group())  # 匹配到'bbb'
    
    #  '{n,m}' 匹配前一个字符n到m次
    print(re.findall("ab{1,3}","abb abc abbcbbb")) # ['abb', 'ab', 'abb']
    
    #  '|' 匹配|左或|右的字符
    print(re.search("abc|ABC","ABCBabcCD").group()) #  ABC
    
    #  (...)' 分组匹配
    print( re.search("(abc){2}a(123|45)", "abcabca456c").group()) # abcabca45
    print(re.search('[q-z]{1,3}','ab123qwe').group()) # qw
    print(re.search('([a-z]+)([0-9]+)','zbc12a5').groups())  # ('zbc', '12')
     

    re的匹配语法2实例:

     
    #!/usr/bin/env python3
    #-*- coding:utf-8 -*-
    # write by congcong
    
    import re
    
    #  'A' 只从字符开头匹配
    print(re.search("Aabc","alexabc")) # 匹配不到的,相当于re.match('abc',"alexabc") 或^
    print(re.search('Aale','alexabc').group()) # ale
    
    #  '' 匹配字符结尾,同$
    print(re.search('abc','alexabc').group())  # abc
    
    #  'd' 匹配数字0-9
    print(re.search('d+','123ab4').group())  # 123
    
    #  'D' 匹配非数字
    print(re.search('D+','asd$12!@').group())  # asd$
    print(re.findall('D+','asd$12!@'))   # ['asd$', '!@']
    
    #   'w'  匹配[A-Za-z0-9]
    print(re.search('w+','123abA!4').group())  # 123abA
    
    #   'W'  匹配 非 [A-Za-z0-9]
    print(re.search('W+','123abA!4').group()) # !
    
    #  's'  匹配空白字符、	、
    、
      结果 '	'
    print(re.search("s+","ab	c1
    3")) # <_sre.SRE_Match object; span=(2, 3), match='	'>
    
    # '(?P<name>...)' 分组匹配 结果{'province': '3714', 'city': '81', 'birthday': '1993'}
    re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city")
    
    s = '412142199612012510'
    res = re.search('(?P<province>d{3})(?P<city>d{3})(?P<born_year>d{4})',s).groups()
    print(res) # ('412', '142', '1996')
    
    # re.split 以匹配到的字符当做列表分隔符
    s = 'qeqwe135asdf14as!df-312qw'
    print(re.split('d+|!|-',s)) # ['qeqwe', 'asdf', 'as', 'df', '', 'qw']
    cunt ='12334+2312*12-56/8%2'
    print(re.split('[+*-/%]',cunt,maxsplit=3))  # ['12334', '2312', '12', '56/8%2']
    
    #  re.fullmatch 全部匹配
    print(re.fullmatch('w+@w+.(com|cn|edu)','ccqwe@asdf.com').group())  # ccqwe@asdf.com
    
    # re.compile 先制定规则,再匹配,提高效率
    str = re.compile('d+@w+.com')
    print(str.fullmatch('935259249@qq.com').group()) # 935259249@qq.com
    
    # re.sub 替换
    s = 'qwert1234zx666hyt999'
    print(re.sub('d+','*',s))  # qwert*zx*hyt*
    print(re.sub('d+','%',s,count=2)) # qwert%zx%hyt999
    
    '''
    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个意思一样
    
    '''
    # re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
    print(re.search('a','Alehello',re.I).group())  # A
    
    # 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*")
     
    目前正在学习Python中,如果有什么不对的地方 希望广大朋友,指出错误指出,深表感谢
  • 相关阅读:
    Nginx+Tomcat 集群部署
    Android5.0新特性——CardView 使用
    Android-SQLite版本问题
    Android UI ListView的使用
    Android
    Android四大组件之Activity一(组件的概念、Intent、监听)
    JAVA内部类使用
    Android 第一个程序 及 环境搭配
    Android-AsyncTask异步任务(获取手机联系人)
    Android-Application
  • 原文地址:https://www.cnblogs.com/shiguanggege/p/12813744.html
Copyright © 2020-2023  润新知