• Python 正则


    Python 正则

    # 正则表达式
    """
    re 模块使 Python 语言拥有全部的正则表达式功能
    re.match函数  re.match(pattern, string, flags=0)
    re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
      pattern    匹配的正则表达式
      string    要匹配的字符串。
      flags    标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
      匹配成功re.match方法返回一个匹配的对象,否则返回None
      可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
         group(num=0)    匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
         groups()    返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
    具体使用
    # 导入re模块
    import re
    
    # 使用match方法进行匹配操作
    result = re.match(正则表达式,要匹配的字符串)
    
    # 如果上一步匹配到数据的话,可以使用group方法来提取数据
    result.group()
    """
    
    # 示例
    import re
    result = re.match("itcast", "itcast.cn")
    result2 = re.match("itcast", "444.cn.itcast")
    print(result.group())
    print(result2)  # 不是从头开始 返回None
    
    
    """
    匹配单个字符
    .    匹配任意1个字符(除了
    )
    [ ]    匹配[ ]中列举的字符
    d    匹配数字,即0-9
    D    匹配非数字,即不是数字
    s    匹配空白,即 空格,tab键
    S    匹配非空白
    w    匹配单词字符,即a-z、A-Z、0-9、_
    W    匹配非单词字符
    """
    
    # 示例 .
    ret = re.match("t.o", "two")
    print(ret.group())
    
    # 示例 []
    ret = re.match("[hH]", "hello Python")
    print(ret.group())
    # 匹配0到9第一种写法
    ret = re.match("[0123456789]Hello Python", "7Hello Python")
    print(ret.group())
    # 匹配0到9第二种写法
    ret = re.match("[0-9]Hello Python", "7Hello Python")
    print(ret.group())
    ret = re.match("[0-35-9]Hello Python", "7Hello Python")
    print(ret.group())
    
    # 示例 d
    ret = re.match("嫦娥d号","嫦娥2号发射成功")
    print(ret.group())
    
    # 示例 s
    ret = re.match("嫦娥s号", "嫦娥 号发射成功")
    print(ret.group())
    
    # 示例 w
    ret = re.match('w', "ath565656")
    print(ret.group())
    
    # 匹配多个字符
    """
    *    匹配前一个字符出现0次或者无限次,即可有可无
    +    匹配前一个字符出现1次或者无限次,即至少有1次
    ?    匹配前一个字符出现1次或者0次,即要么有1次,要么没有
    {m}    匹配前一个字符出现m次
    {m,n}    匹配前一个字符出现从m到n次
    """
    # 示例1:*
    ret = re.match("[A-Z][a-z]*","MnnM")
    print(ret.group())
    
    # 示例2:+
    names = ["name1", "_name", "2_name", "__name__"]
    for name in names:
        ret = re.match("[a-zA-Z_]+[w]*",name)
        if ret:
            print("变量名 %s 符合要求" % ret.group())
        else:
            print("变量名 %s 非法" % name)
    
    # 示例3:?
    ret = re.match("[1-9]?[0-9]", "7")
    print(ret.group())
    
    # 示例4:{m} {m,n}
    ret = re.match("[a-zA-Z0-9_]{6}", "12a3g45678")
    print(ret.group())
    
    ret = re.match("[a-zA-Z0-9_]{8,20}", "1ad12f23s34455ff66")
    print(ret.group())
    
    # 匹配开头结尾
    """
    ^    匹配字符串开头
    $    匹配字符串结尾
    """
    
    # 示例1:$ 匹配163.com的邮箱地址
    email_list = ["xiaoWang@163.com", "xiaoWang@163.comheihei", ".com.xiaowang@qq.com"]
    for email in email_list:
        ret = re.match("[w]{4,20}@163.com$", email)
        if ret:
            print("%s 是符合规定的邮件地址,匹配后的结果是:%s" % (email, ret.group()))
        else:
            print("%s 不符合要求" % email)
    
    # 匹配分组
    """
    |        匹配左右任意一个表达式
    (ab)    将括号中字符作为一个分组
    
    um    引用分组num匹配到的字符串
    (?P<name>)    分组起别名
    (?P=name)    引用别名为name分组匹配到的字符串
    """
    
    # 示例1:| 满足|左右两边任意一个表达式
    ret = re.match("[1-9]?d$|100","100")
    print(ret.group())  # 100
    
    ret = re.match("[1-9]?d$|100","78")
    print(ret.group())  # 78
    
    # 示例2:( )  满足括号中的枚举
    ret = re.match("w{4,20}@(163|126|qq).com", "test@126.com")
    print(ret.group())  # test@126.com
    
    # 示例3:
    um
    ret = re.match(r"<([a-zA-Z]*)>w*</1>", "<html>hh</html>")
    print(ret.group())
    
    labels = ["<html><h1>www.eee.cn</h1></html>", "<html><h1>www.eee.cn</h2></html>"]
    
    for label in labels:
        ret = re.match(r"<(w*)><(w*)>.*</2></1>", label)
        if ret:
            print("%s 是符合要求的标签" % ret.group())
        else:
            print("%s 不符合要求" % label)
    
    # 示例4:(?P<name>) (?P=name)
    ret = re.match(r"<(?P<name1>w*)><(?P<name2>w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.eee.cn</h1></html>")
    ret.group()
    ret = re.match(r"<(?P<name1>w*)><(?P<name2>w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.eee.cn</h2></html>")
    ret.group()
    
    # 高级语法
    """
    re.search(pattern,string,flags) 扫描整个字符串并返回第一个成功的匹配
        re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;
        re.search匹配整个字符串,直到找到一个匹配。
    
    re.findall(string[, pos[, endpos]])  在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表
        string 待匹配的字符串。
        pos 可选参数,指定字符串的起始位置,默认为 0。
        endpos 可选参数,指定字符串的结束位置,默认为字符串的长度。
        
    re.sub(pattern, repl, string, count=0, flags=0)  替换字符串中的匹配项
        pattern : 必填正则中的模式字符串。
        repl : 必填替换的字符串,也可为一个函数。
        string : 必填要被查找替换的原始字符串。
        count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
        flags : 编译时用的匹配模式,数字形式
    re.split() 根据匹配进行切割字符串,并返回一个列表
        pattern    匹配的正则表达式
        string    要匹配的字符串。
        maxsplit    分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
        flags    标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
    
    """
    
    # search
    print(re.search('www', 'www.eee.com').group())  # 在起始位置匹配
    print(re.search('com', 'www.eee.com').group())  # 不在起始位置
    
    # sub
    ret = re.sub(r"d+", '998', "id = 997")
    print(ret)
    # 设定函数调用 依据表达式查找到数据后,调用函数 再返回
    def add(temp):
        strNum = temp.group()
        num = int(strNum) + 1
        return str(num)
    
    ret = re.sub(r"d+", add, "python = 99")
    print(ret)
    
    # findall
    ret = re.findall(r"d+", "python = 9999, c = 7890, c++ = 12345")
    print(ret)
    
    pattern = re.compile(r'd+')   # 查找数字 创建表达式
    result1 = pattern.findall('runoob 123 google 456')
    result2 = pattern.findall('run88oob123google456', 0, 10)  # 从0开始到10结束查找
    
    # split
    ret = re.split(r":| ", "info:xiaoZhang 33 shandong")  # 以冒号或空格切割
    print(ret)
    re.split('a*', 'hello world')   # 对于一个找不到匹配的字符串而言,split 不会对其作出分割
    
    # r的作用
    """
    Python中字符串前面加上 r 表示原生字符串
    >>> ret = re.match(r"c:\a",mm).group()
    >>> print(ret)
    c:a
    """
    
    # 常用正则符号
    """
    1、 ? 匹配0次或一次前面的分组(问号在正则表达式中可声明非贪心匹配模式,这两种含义是完全无关的)
    2、 * 匹配0次或多次前面的分组
    3、 + 匹配1次或多次前面的分组
    4、 {n} 匹配n次前面的分组
    5、 {n,} 匹配n次或更多次前面的分组
    6、 {,m} 匹配0次到m次前面的分组
    7、 {n,m} 匹配至少n次,最多m次前面的分组
    8、 {n,m}?或*?或+?对前面的分组进行非贪心匹配
    9、 ^ABC 匹配以ABC开头的字符串
    10、 ABC$ 匹配以ABC结尾的字符串
    11、 . 匹配所有字符,换行符除外
    12、 d、w和s分别匹配数字、单词和空格
    13、 D、W和S分别匹配除数字、单词、和空格外的所有字符
    14、 [abc] 匹配方括号内的任意字符(诸如a、b或c)
    15、 [^abc] 匹配不在方括号内的任意字符
    """
  • 相关阅读:
    Hackthebox 渗透测试笔记-popcorn[linux提权]
    HTB 渗透测试笔记-Devel[msvenom][提权]
    HTB 渗透测试笔记-Legacy
    Hackthebox网络不稳定的解决方案
    eslint 常用配置
    第十课之培训课程总结
    第九课 复习之从零开始搭建页面
    第八课之提高开发效率的es6以及函数
    第七课之dva以及前后端交互
    第六课之antd以及组件开发介绍
  • 原文地址:https://www.cnblogs.com/ddf128/p/12038612.html
Copyright © 2020-2023  润新知