• re正则模块细解,面向对象编程思路的优劣。


    Python小白,白嫖基地。

    一, re模块(正则表达式)

    正则表达式是什么:

    由一系列特殊字符拼接而成的表达式/规则,该表达式用于从一个大字符串中匹配出符合规则的子字符串

    正则表达式:记忆图

    在这里插入图片描述

    正则表达式讲解示例:

    1 w 模式匹配字母数字,以及下划线:

    s='a b	,t-ie ns2_?(k8'  #对象。
    
    print(re.findall('w',f'{s}')) 
    

    结果:

    ['a', 'b', 't', 'i', 'e', 'n', 's', '2', '_', 'k', '8']
    

    2 W模式下匹配非字母,数字,下划线

    s='a b	,t-ie ns2_?(k8'  #对象。
    
    print(re.findall('W',f'{s}'))
    

    结果:

    [' ', '	', ',', '-', ' ', '?', '(']
    

    3 s模式下匹配任意空白字符,如( , , ,f)

    s='a b	,t-ie ns2_?(k8'  #对象。
    
    print(re.findall('w',f'{s}')) 
    

    结果:

    [' ', '	', ' ']
    

    4 S 模式下匹配非空白字符

    ss='a 6k	,1t8y-i  s256_?(k798' #对象。
    
    print(re.findall('S',f'{s}'))
    

    结果:

    ['a', 'b', ',', 't', '-', 'i', 'e', 'n', 's', '2', '_', '?', '(', 'k', '8']
    

    5 d模式下匹配任意数字(0-9) 单个字符匹配

    ss='a 6k	,1t8y-i  s256_?(k798'  #对象。
    
    print(re.findall('d',f'{ss}'))
    

    结果:

    ['6', '1', '8', '2', '5', '6', '7', '9', '8']
    

    6 D模式下匹配任意非数字

    s='a b	,t-ie ns2_?(k8'  #对象。
    
    print(re.findall('D',f'{ss}'))
    

    结果:

    ['a', ' ', 'k', '	', ',', 't', 'y', '-', 'i', ' ', ' ', 's', '_', '?', '(', 'k']
    

    7. 与

    msg="""h e	ll
    
    o 123_ (0
    	1
        2
    3
    """
    print(re.findall('
    ',msg))
    print(re.findall('	',msg))
    print(re.findall(' ',msg))
    

    结果:

    ['
    ', '
    ', '
    ', '
    ', '
    ', '
    ']
    ['	', '	']
    [' ', ' ', ' ', ' ', ' ', ' ', ' ']
    

    8 ^与$ ^是以什么什么开头,以什么什么结尾

    print(re.findall("egon","egon asdf 213123 egonafsadfegon"))#未加标识
    
    print(re.findall("^egon","egon asdf 213123 egonafsadfegon"))#以什么什么开头
    print(re.findall("egon$","egon asdf 213123 egonafsadfegon"))#以什么什么结尾
    print(re.findall("egon$","egon asdf 213123 egonafsadfegon "))#末尾有空格
    
    
    print(re.findall("awwwc","ab12c3c a213c"))#以a开头b结尾,中间可以是字母数字,以及下划线
    print(re.findall("^awwwc$","ab_2c"))
    

    结果:

    ['egon', 'egon', 'egon']
    ['egon']
    ['egon']
    []
    
    ['ab12c', 'a213c']
    ['ab_2c']
    

    9.1 .(点):代表匹配一个字符,该字符可以是任意字符

    print(re.findall("adb","a1b a2b aab aaaaaaab a+b a-b a c"))
    print(re.findall("awb","a1b a2b aab aaaaaaab a+b a-b a c"))
    print(re.findall("a.b","a1b a2b aab aaaaaaab a+b a-b a b a c"))
    print(re.findall("a.b","a1b a2b aab aaaaaaab a	b a-b a
    b a c"))
    #加上 re.DOTALL 可以吧
    也给取出来
    print(re.findall("a.b","a1b a2b aab aaaaaaab a	b a-b a
    b a c",re.DOTALL))
    

    结果:

    ['a1b', 'a2b']
    ['a1b', 'a2b', 'aab', 'aab']
    ['a1b', 'a2b', 'aab', 'aab', 'a+b', 'a-b', 'a b']
    ['a1b', 'a2b', 'aab', 'aab', 'a	b', 'a-b']
    ['a1b', 'a2b', 'aab', 'aab', 'a	b', 'a-b', 'a
    b']
    

    9.2 []:代表匹配一个字符,我们可以指定该字符的范围

    print(re.findall("a[+-]b", "a1b a2b aab aaaaaaab a+b a-b a c"))
    print(re.findall("a[.*/+-]b", "a.b a2b a*b a/b aab aaaaaaab a+b a-b a c"))
    print(re.findall("a[a-z]b", "a.b a2b a*b a/b aab aaaaaaab a+b a-b a c")) # -放在[]内的开头或结果
    print(re.findall("a[a-zA-Z]b", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c")) # -放在[]内的开头或结果
    print(re.findall("adb", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c")) # -放在[]内的开头或结果
    print(re.findall("a[0-9]b", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c")) # -放在[]内的开头或结果
    # [^...]代表取反
    print(re.findall("a[^0-9]b", "a.b a2b a*b a/b aAb aCb aab aaaaaaab a+b a-b a c")) # -放在[]内的开头或结果
    

    结果:

    ['a+b', 'a-b']
    ['a.b', 'a*b', 'a/b', 'a+b', 'a-b']
    ['aab', 'aab']
    ['aAb', 'aCb', 'aab', 'aab']
    ['a2b']
    ['a2b']
    ['a.b', 'a*b', 'a/b', 'aAb', 'aCb', 'aab', 'aab', 'a+b', 'a-b']
    

    9.3 *: 左边那个字符出现0次或者无穷次

    print(re.findall("ab*","a ab abb abbbbbbbbbbbb bbbbbbbbb"))
    

    结果:

    ['a', 'ab', 'abb', 'abbbbbbbbbbbb']#遇到空格停止。
    

    9.4 +: 左边那个字符出现1次或者无穷次

    print(re.findall("ab+","a ab abb abbbbbbbc bbbabbcbb"))
    

    结果:

    ['ab', 'abb', 'abbbbbbb', 'abb']
    

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

    print(re.findall("ab{0,}","a ab abb abbbbbbcbbbb babbbbbvbbb"))
    #与上述的等价
    print(re.findall("ab*","a ab abb abbbbbbcbbbb babbbbbvbbb"))
    
    print(re.findall("ab{1,}","a ab abb abbbbbbcbbbb babbbbbvbbb"))
    #与上述的等价
    print(re.findall("ab+","a ab abb abbbbbbcbbbb babbbbbvbbb"))
    

    结果:

    ['a', 'ab', 'abb', 'abbbbbb', 'abbbbb']
    ['a', 'ab', 'abb', 'abbbbbb', 'abbbbb']
    ['ab', 'abb', 'abbbbbb', 'abbbbb']
    ['ab', 'abb', 'abbbbbb', 'abbbbb']
    

    9.6 ?: 左边那个字符出现0次到1次

    print(re.findall("ab?","a ab abb abbbbbbbbbbbb bbbabbbbb"))
    

    结果:

    ['a', 'ab', 'ab', 'ab', 'ab']
    

    9.7 .*: 匹配所有

    print(re.findall("a.*b","123 a1231-==-000b123123123123123b"))
    
    #  .*?: 匹配所有(加上问号不会匹配接下来的b遇到第一个就结束了,防止它过度抓取)
    print(re.findall("a.*?b","123 a1231-==-000b123123123123123b"))
    

    结果:

    ['a1231-==-000b123123123123123b']
    ['a1231-==-000b']
    

    例1:取地址信息

    msg='< a href="https://pan.baidu.com/s/1skWyTT7" target="_blank"><strong><span style="color: #ff0000;">原理图:https://pan.baidu.com/s/1skWyTT7</span></strong></ a>< a href="https://www.baidu/com">"点我啊"</ a>'
    print(re.findall('href=".*?"',msg))
    print(re.findall('href="(.*?)"',msg))
    

    结果:

    ['href="https://pan.baidu.com/s/1skWyTT7"', 'href="https://www.baidu/com"']
    ['https://pan.baidu.com/s/1skWyTT7', 'https://www.baidu/com']
    

    例2:取以a开头b结尾的所有字符串

    print(re.findall("a.*b","a1b a+b a-b a
    b a	b",re.DOTALL))
    print(re.findall("a.*b","a1b a+b a-b a
    b a	b"))
    

    结果:

    ['a1b a+b a-b a
    b a	b']  #re.DOTALL可以让*吧
    也抓取到
    ['a1b a+b a-b', 'a	b']
    

    10 ():分组

    print(re.findall('ab+','ababab123')) #['ab', 'ab', 'ab']
    print(re.findall('(ab)+123','ababab123')) #['ab'],匹配到末尾的ab123中的ab
    

    结果:

    ['ab', 'ab', 'ab']
    ['ab']
    

    10.1 取消分组

    print(re.findall('(?:ab)+123','ababab123'))
    #findall的结果不是匹配的全部内容,而是组内的内容,?:可以让结果为匹配的全部内容
    

    结果:

    ['ababab123']
    

    11 |:或者

    print(re.findall("compan(?:ies|y)","Too many companies have gone bankrupt, and the next one is my company'"))
    
    print(re.findall("(d+.?d+)","aslfdasldf1111asdf3333dfadf3.4dafadf3.5555asdfsafd.5555"))
    

    结果:

    ['companies', 'company']
    ['1111', '3333', '3.4', '3.5555', '5555']
    

    12.

    print(re.findall('a\\c','ac a1c aac')) 
    #对于正则来说a\c确实可以匹配到ac,但是在python解释器读取a\c时,
    #会发生转义,然后交给re去执行,所以抛出异常
    print(re.findall(r'a\c','ac a1c aac'))
    #对于正则来说a\c确实可以匹配到ac,但是在python解释器读取a\c时,
    #会发生转义,然后交给re去执行,所以抛出异常
    

    结果:

    ['a\c']
    ['a\c']
    

    12.1re模块提供的方法介绍\ re.search

    print(re.findall('e','alex make love') )  
    #['e', 'e', 'e'],返回所有满足匹配条件的结果,放在列表里
    print(re.search('e','alex make love')) 
    #e,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
    

    结果:

    ['e', 'e', 'e']
    <re.Match object; span=(2, 3), match='e'>
    

    12. 2 .group()

    print(re.search("d+.?d*","1.3 aa3.44aaa").group())
    print(re.search("d+.?d*","asdfsadf"))
    

    结果:

    1.3
    None
    

    12.3 分割.split(‘加条件’)

    msg="egon:18-male=10"
    print(msg.split(':'))
    print(re.split('[:=-]',msg))
    

    结果:

    ['egon', '18-male=10']
    ['egon', '18', 'male', '10']
    

    面向对象编程思路

    面向过程编程

    • 核心是过程二字,过程是解决问题的步骤,即先干啥再干啥后干啥
    • 基于该思想写程序就是在设计一条条的流水线
    优点:复杂的问题流程化、进而简单化
    缺点:扩展性差
    

    面向对象编程

    • 核心是对象二字,对象是一个用来盛放数据与功能的容器
    • 基于该思想写程序就是在整合程序
    优点:可扩展性强
    缺点:编程的复杂度高
    
    努力学习!
  • 相关阅读:
    C++之流与文件
    C++之检测文件结尾
    统信UOS
    统信UOS
    统信UOS
    八、【Docker笔记】使用Dockerfile创建镜像
    七、【Docker笔记】Docker中网络基础配置
    六、【Docker笔记】Docker数据管理
    五、【Docker笔记】Dockers仓库
    四、【Docker笔记】Docker容器
  • 原文地址:https://www.cnblogs.com/Orange-YXH/p/13648109.html
Copyright © 2020-2023  润新知