• 模板


    re模块

    可以结合正则表达式去用

    正则表达式就是一堆符号,英文符号,小写大写或者键盘上的一些特殊符号,这写符号拼在一起称为一种规则

    然后规则去大字符串当中筛选符合规则的

    re.findall

     print(re.findall('abc','abcxxxxabcakejsiabcngk '))
    # abcxxxxabkejsingk   #大字符串
    # abc   #正则表达式
    >>>['abc', 'abc', 'abc']
    
    

    w 字母数字下划线 W除了字母数字下划线

    print(re.findall('w','hello_123 * -+ '))
    >>>['h', 'e', 'l', 'l', 'o', '_', '1', '2', '3']
    #字母数字下划线
    
    print(re.findall('W','hello_123 * -+ '))
    >>>[' ', '*', ' ', '-', '+', ' ']
    #除了数字字母下划线
    
    print(re.findall('awb','a1b a_b a+b a-b aab aaaaab'))
    >>>['a1b', 'a_b', 'aab', 'aab']
    #a和b直接字母数字下划线
    

    s看不见的符号 空白字符 S非空白字符

    print(re.findall('s','a b  
    	c123'))
    >>>[' ', ' ', ' ', '
    ', '	']
    #看不见的符号   空白字符
    
    
    print(re.findall('S','a b  
    	c123'))
    #非空白字符
    

    d数字 D非数字

     print(re.findall('d','a b  
    	c123'))
     >>>['1', '2', '3']
     #数字
        
     print(re.findall('D','a b  
    	c123'))
     >>>['a', ' ', 'b', ' ', ' ', '
    ', '	', 'c']
     #非数字
    

    ^从头开始匹配 $从尾部开始匹配

    # ^从头开始匹配
    print(re.findall('^awb','a1b a_b a+b a-b aab aaaaab'))
    >>>['a1b']
    
    #$从末尾开始对
    print(re.findall('awb$','a1b a_b a+b a-b aab aaaaab'))
    >>>['aab']
    
    
    #和A...的区别
    print(re.findall('^egon$','egon'))
    >>>['egon']
    print(re.findall('Aegon','egon'))
    >>>['egon']
    #没有换行符的时候作用是一样的
    
    #当在多行中的时候这俩取到的是空   作用也是一样的
    print(re.findall('^egon$',"""
    egon
    egon123
    egon
    """))
    >>>[]
    
    print(re.findall('Aegon',"""
    egon
    egon123
    egon
    """))
    >>>[]
    
    #但是加入re.M忽略换行后   A..会忽略re.M的作用
    
    print(re.findall('^egon$',"""
    egon
    egon123
    egon
    """,re.M))
    >>>['egon', 'egon']
    
    print(re.findall('Aegon',"""
    egon
    egon123
    egon
    """,re.M))
    >>>[]
    

    换行符

    print(re.findall('
    ','a
    b
    c'))
    >>>['
    ', '
    ']
    #换行符
    

    制表符

    print(re.findall('	','a	b
    c'))
    >>>['	']
    #制表符
    

    .代表任意类型 (不包括不可见类型)

    加上re.DOTALL 就也包括了像换行符之类的不可见类型

    print(re.findall('a.c','a1c a2c aAc a+c a
    c aaaac'))
    >>>['a1c', 'a2c', 'aAc', 'a+c', 'aac']
    
    print(re.findall('a.c','a1c a2c aAc a+c a
    c aaaac',re.DOTALL))
    >>>['a1c', 'a2c', 'aAc', 'a+c', 'a
    c', 'aac']
    

    []在正则表达式中的作用

    指定字符

    print(re.findall('a[1+]c','a1c a2c aAc a+c a
    c aaaac',re.DOTALL))
    >>>['a1c', 'a+c']
    #指满足a和c中间有一个符号  1 或者+
    print(re.findall('a[1-]c','a1c a2c aAc a+c a-c a
    c aaaac',re.DOTALL))
    >>>['a1c', 'a-c']
    #指满足a和c中间有一个符号  1 或者-
    

    指定范围

    print(re.findall('a[0-9]c','a1c a2c aAc a+c a
    c aaaac',re.DOTALL))
    >>>['a1c', 'a2c']
    print(re.findall('a[a-z]c','a1c a2c aAc a+c a
    c aaaac',re.DOTALL))
    >>>['aac']
    print(re.findall('a[A-Z]c','a1c a2c aAc a+c a
    c aaaac',re.DOTALL))
    >>>['aAc']
    print(re.findall('a[0-D]c','a1c a2c aAc a+c a-c a
    c aaaac',re.DOTALL))
    >>>['a1c', 'a2c', 'aAc']
    
    #这里看出- 有另一个作用是为了标记范围  只在两个符号之间有效
    当不在两个符号之间时候 就指定-这个符号
    print(re.findall('a[+*/-]c','a+c a-c a*c a/c a1c a9c aAc'))
    >>>['a+c', 'a-c', 'a*c', 'a/c']
    
    加上^
    print(re.findall('a[^+*/-]c','a+c a-c a*c a/c a1c a9c aAc'))
    #除了+ * / -  以外
    >>>['a1c', 'a9c', 'aAc']
    

    ? 左边那 “一个”字符出现0次或者1次 会匹配出来

    print(re.findall('ab?','b a ac aed abbbbbbbbbb ab'))
    >>>['a', 'a', 'a', 'ab', 'ab']
    根据规则匹配a  或者a后面没有跟b  或者a后面跟了b但是无论几个只保留一个匹配粗来
    

    “ * ”左边那一个字符出现0次或者无穷次

    print(re.findall('ab*','b a ac aed abbbbbbbbbb ab'))
    >>>['a', 'a', 'a', 'abbbbbbbbbb', 'ab']
    

    “ + ”左边那一个字符出现1次或者无穷次

    print(re.findall('ab+','b a ac aed abbbbbbbbbb ab'))
    >>>['abbbbbbbbbb', 'ab']
    

    {n,m} 左边那一个字符出现n次到m次

    print(re.findall('ab{2,4}','b a ab abb abbb abbbb abbbbb abbbbbb abbbbbbbbbb ab'))
    >>>['abb', 'abbb', 'abbbb', 'abbbb', 'abbbb', 'abbbb']
    
    
    #{n,m}
    可以取代以上 ? * + 三种用途  0或者1   0或者无穷 1或者无穷
    print(re.findall('ab{0,1}','b a abb abbb abbbbbbbbbb ab')) #0或者1
    print(re.findall('ab{0,}','b a abb abbb abbbbbbbbbb ab')) #0或者无穷
    print(re.findall('ab{1,}','b a abb abbb abbbbbbbbbb ab')) #1或者无穷
    

    贪婪与非贪婪

    a开头 .*任意类型0或者无穷  c结束  以最后一个c为结束标准不会中断取值  
    就是a 和c中间可以是任意多少个可视符号  但如果c有多个不会第一次匹配到c就停止会一直匹配 到最后一个c  贪婪匹配
    print(re.findall('a.*c','a123dsfc+-1234dkjiienflawc'))
    # >>>['a123dsfc+-1234dkjiienflawc']
    #贪婪
    注意.  不包括不可视符号 
    换行符
    print(re.findall('a.*c','a123
    dsfc+-1234dkjiienflawc'))
    # >>>['awc']
    加上re.DOTALL   就包括
     等特殊定义符
    print(re.findall('a.*c','a123
    dsfc+-1234dkjiienflawc',re.DOTALL))
    # >>>['a123
    dsfc+-1234dkjiienflawc']
    
    a 开头 .*任意类型 ?0或者1 意思是当取到第一个c就立马结束 不管有多少个c符号
    print(re.findall('a.*?c','a123
    dsfc+-1234dkjiienflawc',re.DOTALL))
    >>>['a123
    dsfc', 'awc']
    #非贪婪
    
    

    默认分组内容

    要求取到网址即可
    print(re.findall("'.*?'","< a href='https://www.baidu.com.cn'>'我特么是百度啊'</ a>< a href='https://www.sina.com.cn'>'我特么是新浪啊'</ a>"))
    >>>["'https://www.baidu.com.cn'", "'我特么是百度啊'", "'https://www.sina.com.cn'", "'我特么是新浪啊'"]
    
    print(re.findall("href='.*?'","< a href='https://www.baidu.com.cn'>'我特么是百度啊'</ a>< a href='https://www.sina.com.cn'>'我特么是新浪啊'</ a>"))
    >>>["href='https://www.baidu.com.cn'", "href='https://www.sina.com.cn'"]
    包含了别的字符  ()用这种形式把取出来的值分组  
    print(re.findall("href='(.*?)'","< a href='https://www.baidu.com.cn'>'我特么是百度啊'</ a>< a href='https://www.sina.com.cn'>'我特么是新浪啊'</ a>"))
    >>>['https://www.baidu.com.cn', 'https://www.sina.com.cn']
    #默认留分组内容
    

    取消分组

    print(re.findall("href='(.*?)'","< a href='https://www.baidu.com.cn'>'我特么是百度啊'</ a>< a href='https://www.sina.com.cn'>'我特么是新浪啊'</ a>"))
    >>>['https://www.baidu.com.cn', 'https://www.sina.com.cn']
    
    print(re.findall("href='(?:.*?)'","< a href='https://www.baidu.com.cn'>'我特么是百度啊'</ a>< a href='https://www.sina.com.cn'>'我特么是新浪啊'</ a>"))
    >>>["href='https://www.baidu.com.cn'", "href='https://www.sina.com.cn'"]
    #取消分组
    
    这里取消分组没有什么意义  取消分组在特定场景下有独特作用如下
    取出字符串内所有数字
    print(re.findall('','abac1j3ijii2.41j2k4ij5j1kj2k44444iij2j31n2.4'))
    分组特性就是只会展示括号内的符号  所以必须取消阔号 直接去掉效果你可以试一下
    print(re.findall('d+(.d+)?','abac1j3ijii2.41j2k4ij5j1kj2k44444iij2j31n2.4'))
    # >>>['', '', '.41', '', '', '', '', '', '', '', '', '.4']
    用?:取消分组的方式  效果如下
    print(re.findall('d+(?:.d+)?','abac1j3ijii2.41j2k4ij5j1kj2k44444iij2j31n2.4'))
    # >>>['1', '3', '2.41', '2', '4', '5', '1', '2', '44444', '2', '31', '2.4']
    
    

    如何取消大字符串中的特殊意义

    print(re.findall('a\c','ac a1c a2c'))
    # >>>['a\c']
    第一种用取消python特殊意思再用取消掉的文件中意义
    print(re.findall(r'a\c','ac a1c a2c'))
    # >>>['a\c']
    第二种是r模式 python读入时候会把当作普通符号 只需要取消用一个取消在语法中的特殊意义
    

    re.search

    es=re.search('egon','123 egon egon xxx egon')
    print(res)
    >>><re.Match object; span=(4, 8), match='egon'>
    
    res=re.search('egonxxx','123 egon egon xxx egon')
    print(res)
    # >>>None
    

    序列化

  • 相关阅读:
    [CF864F]Cities Excursions
    [AGC012F]Prefix Median
    [TC-FindingFriends]Finding Friends
    [TC-HouseProtection]House Protection
    [CTSC2018]假面
    [CF877F]Ann and Books
    [CF509F]Progress Monitoring
    [CF735E/736C]Ostap and Tree
    CF611H New Year and Forgotten Tree
    CF538H Summer Dichotomy
  • 原文地址:https://www.cnblogs.com/cnblogswilliam/p/14243397.html
Copyright © 2020-2023  润新知