美文网首页
day23-re模块

day23-re模块

作者: 天行_b6d0 | 来源:发表于2020-08-06 18:40 被阅读0次

    一、re模块的几个函数

    1、re.match()
    • re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
    • 函数语法: re.match(pattern, string, flags=0)(正则表达式,字符串,标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。)
    • 匹配成功re.match方法返回一个匹配的对象,否则返回None。
    import re
    print(re.match('www', 'www.runoob.com').span())  # 在起始位置匹配
    print(re.match('com', 'www.runoob.com'))         # 不在起始位置匹配
    
    2、re.search方法
    • re.search 扫描整个字符串并返回第一个成功的匹配。
    • 函数语法:re.search(pattern, string, flags=0)
    import re
    print(re.search('www', 'www.runoob.com').span())  # 在起始位置匹配
    print(re.search('com', 'www.runoob.com').span())         # 不在起始位置匹配
    
    3、findall方法
    • 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

    • 注意: match 和 search 是匹配一次 findall 匹配所有。

    • 语法格式为:findall(string[, pos[, endpos]])

    参数:

    1. string : 待匹配的字符串。
    2. pos : 可选参数,指定字符串的起始位置,默认为 0。
    3. endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。

    二、正则表达式

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

    1、\w 匹配数字、字母、下划线
    import re
    print(re.findall('\w',"1b2  hhh c_1    ahvfbfioi"))
    
    2、\W 非数字、字母、下划线
    import re
    print(re.findall('\W',"1b2  hhh c_1    @ahvfbfioi"))
    
    3、\s匹配 任意空白字符,{\t,\n,\r,\f}
    import re
    print(re.findall('\s',"1b2  h\nhh c_1\tahvfbfioi"))
    
    4、\S 非空白字符
    import re
    print(re.findall('\S',"1b2  h\nhh c_1\tahvfbfioi"))
    
    5、\d 匹配任意数字
    import re
    print(re.findall('\d',"21b  h\nhh c_1\tahvfbfioi"))
    
    6、\D 匹配任意非数字
    import re
    print(re.findall('\D',"1b2  h\nhh c_1\tahvfbfioi"))
    
    7、 .用来匹配任意一个字符
    import re
    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\tb a-b a\nb ac",re.DOTALL))  # 加上可以匹配换行符
    
    8、 ^匹配字符串开头
    import re
    print(re.findall("^a.b"," a1b a2b aab aaaaaaab a+b a-b a b a c"))  # 开头匹配不到就不匹配了
    
    9、$ 匹配字符串末尾
    import re
    print(re.findall("a.b$"," a1b a2b aab aaaaaaab a+b a-b a b a c"))  # 从尾部开始匹配不到就不匹配了
    
    10、 [ ]匹配中括号里面范围内的字符
    import re
    print(re.findall("a[^a-z-]b"," a1b aZb aab aaaaaaab a+b a-b a b a c"))  # 加上^是取反
    
    11、?左边的字符出现0或1次
    import re
    print(re.findall("ab?"," a1b ab abbb a2b aab aaaaaaab a+b a-b a b a c"))
    
    12、 * 左边字符出现0或无数次
    import re
    print(re.findall("a*b"," a1b a2b aab aaaaaaab a+b a-b a b a c"))
    
    13、+左边字符出现一次或无数次
    import re
    print(re.findall("a+b"," a1b a2b aab aaaaaaab a+b a-b a b a c"))
    
    14、{n,m}左边那个字符出现n次到m次
    import re
    print(re.findall("a{0,8}b"," a1b a2b aab aaaaaaab a+b a-b"))
    
    15、 ():分组 把括号里的当成一个整体进行匹配,每组取一个
    import re
    print(re.findall('ab+','ababab123'))   # ['ab', 'ab', 'ab']
    print(re.findall('(ab)+123','ababab123'))   # ['ab'],匹配到末尾的ab123中的ab
    
    16、取消分组
    import re
    print(re.findall('(?:ab)+123','ababab123'))   # findall的结果不是匹配的全部内容,而是组内的内容,?:可以让结果为匹配的全部内容
    
    17、 ?!pattern,表示在没有配到pattern的字符串的前提下,再进行后续的正则表达式匹配,后续匹配仍然从被匹配字符串的头开始

    匹配密码,密码必须是由6位数字与字母组成,并且不能是纯数字也不能是纯字母

    print(re.search("(?!^[0-9]+$)(?!^[a-zA-Z]+$)^[0-9A-Za-z]{6}$","123asf").group())  # 123asf
    

    上述正则的意思为:在匹配(?!^[0-9]+$)以及(?!^[a-zA-Z]+$)过后,如果字符串成功后在从头去匹配(?!^[a-zA-Z]+$),最终匹配完。

    18、?=pattern,表示在配到pattern的字符串的前提下,再进行后续的正则表达式匹配,后续匹配仍然从被匹配字符串的头开始

    匹配密码,密码强度:强,必须包含大写,小写和数字,和特殊字符(!,@,#,%,&),且大于6位

    while True:
        pwd = input("please your password: ").strip()  # 比如输入:Aa3@adf123
        pwd_pattern= re.compile("(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#%&])^([a-zA-Z0-9!@#%&]){6,}$")
        if pwd_pattern.search(pwd) is None:
            print("密码强度不够")
        else:
            break
    

    上述正则表达式的意思:

    1. 首先是(?=.*[A-Z])匹配,.*表示密码中可以包含多个字符,[A-Z]代表密码中需要包含至少一个大写字母,注意一定不要去掉.*写成(?=[A-Z]),那样表示密码只能由一个字符组成,该字符是大写字母
    2. 其次是(?=.*[a-z])匹配,同上,确保密码中必须至少有一个小写字母
    3. 然后是(?=.*[0-9])匹配,同上,确保密码中必须至少有一个数字
    4. 然后是(?=.*[!@#%&])匹配,同上,,确保密码中必须至少有一个特殊符号!@#%&
    5. 最后是^([a-zA-Z0-9!@#%&]){6,}$,确保密码是由[a-zA-Z0-9!@#%&]字符构成,至少有6位
    19、?: 是非获取匹配,匹配冒号后的内容但不获取匹配结果,不进行存储供以后使用。

    匹配email:

    print(re.findall("(?:[a-zA-Z0-9]+)@(?:[0-9a-zA-Z]+).com","18611323113@163.com xxx@qq.com"))
    

    正则表达式符号意义.png

    更具体的:http://blog.csdn.net/yufenghyc/article/details/51078107
    手动测试:http://c.runoob.com/front-end/854

    二、面向对象编程

    面向过程编程

    核心是过程二字,过程是解决问题的步骤,即先干啥再干啥后干啥。
    基于该思想写程序就是在设计一条条的流水线

    • 优点:复杂的问题流程化、进而简单化
    • 缺点:扩展性差

    面向对象编程

    核心是对象二字,对象是一个用来盛放数据与功能的容器
    基于该思想写程序就是在整合程序

    • 优点:可扩展性强
    • 缺点:编程的复杂度高

    相关文章

      网友评论

          本文标题:day23-re模块

          本文链接:https://www.haomeiwen.com/subject/siovrktx.html