• 正则表达式


    正则表达式

    一、正则介绍

    二、匹配一个字符

    三、量词

    四、分组和位置

    五、函数

    六、贪婪,懒惰和字符r的作用

    回到顶部

    一、正则介绍

    1.作用

      正则(Regular Expression) : 表达对数据的匹配  过滤  提取逻辑的表达式

      匹配结果对象 = re.match(正则, 数据)

    ​     从头开始匹配 如果某一个匹配失败 整体就失败了

    ​     如果匹配成功 返回匹配结果对象

    ​     如果匹配失败 返回None

      获取匹配结果

    ​     匹配结果对象.group()

      "强烈"建议: 正则一律加上r字符 r字符可以对正则表达式中的    进行转义

    二、匹配一个字符

    1. . 字符

      点字符 : 代表匹配任意一个字符  默认除了  

          re.S模式可以让 . 匹配  :  re.match(r"d{3,5}.+", "123 qq", "re.S")

          . 与字符 点 相同 多用于在匹配邮箱时候使用

    2. [] 匹配字符

      [] : 匹配其中任意一个字符

         [0-9] : 是指 0 - 9 的范围

         [^0-9] : 取反 禁止匹配

    3. d w s字符

      d : 数字字符

      w : 单词字符[0-9a-zA-Z_]

        在py3 中  Unicdode w 可以匹配汉字

        在py2 中  Ascll w不能匹配汉字

      s : 空白字符

    三、量词

    1.{}字符 : 匹配{m,n}, 至少m次 之多n次,  {m}m次

    2.*字符 : 任意次

    3.+字符 : 至少一次

    4.?字符 : 0次或者1次

    四、分组和位置

      1.分组

        目的 : 提取出想要的部分

      2.匿名分组

    目的: 从整体数据提取出 感兴趣的部分数据

    创建: "(正则)"

    ​   用户创建的分组从1开始 0号分组已经存储整体结果

    获取分组结果:

    ​   匹配结果对象.group(分组编号=0)

      ​ .group(编号,编号)

    分组引用:

    ​   希望在正则的后续位置使用前面的分组匹配的数据

    ​   分组的编号

    re.match(r"嫦娥(d+)号", "嫦娥998号").group()    
    re.match(r"嫦娥(d+)号", "嫦娥998号").group(0) 
    re.match(r"嫦娥(d+)号", "嫦娥998号").group(1) 
    
    re.match(r"嫦娥(d+)号 998", "嫦娥998号 998").group(1) 
    re.match(r"嫦娥(d+)号 999", "嫦娥999号 999").group(1)
    # 上面写 不灵活  每次分组数据不一样全部需要改写  
    # 如果需要使用前面分组的数据继续匹配 - 分组引用
    re.match(r"嫦娥(d+)号 1", "嫦娥999号 999").group(1)
    re.match(r"嫦娥(d+)号 1", "嫦娥1999号 1999").group(1) 
    
    re.match(r"(d{3,4})-d{6,8}", "010-000001").group()
    re.match(r"(d{3,4})-d{6,8}", "010-000001").group(1) 
    re.match(r"(d{3,4})-(d{6,8})", "010-000001").group(2)
    
    re.match(r"(d{3,4})-(d{6,8}) 1-2", "010-000001 010-000001").group(2)
    示例代码

      3.命名分组

        应用场景: 默认分组没有名称只能按照分组编号访问 而一旦分组编号发生变化导致正则修改

    ​         给每个分组起一个名称 编号发送变化不会影响正则的使用

        创建

    ​       "(?P<分组名称>正则)"

        获取结果

    ​       .group(分组名称)

    ​       * 也可以通过下标访问

        创建分组并分组引用

    ​       "(?P<分组名称>正则) (?P=分组名称)"

    re.match(r"(?P<area>d{3,4})-(?P<no>d{6,8}) (?P=area)-(?P=no)", "010-000001 010-000001").group(1,2)
    re.match(r"(?P<area>d{3,4})-(?P<no>d{6,8}) (?P=area)-(?P=no)", "010-000001 010-000001").group('no')
    re.match(r"((?P<area>d{3,4})-(?P<no>d{6,8})) (?P=area)-(?P=no)", "010-000001 010-000001").group('no')
    示例代码

      4. | 符号

    r"表达式1|表达式2|表达式3" 匹配|左右任意一个表达式

    r"表达式(部分1|部分2|部分3)" 匹配分组中 |左右任意一个表达式

    re.match(r"^w{4,16}@163.com$", "123456@163.com").group()
    re.match(r"^w{4,16}@163.com$|^w{4,16}@263.com$|^w{4,16}@qq.com$", "123456@qq.com").group()
    re.match(r"^w{4,16}@(163|263|qq).com$", "123456@263.com").group()
    示例代码

    五、函数

      match(正则,数据) - -> 匹配对象 从头匹配

      search(正则,数据) - -> 匹配对象 从头开始搜索  往后面尝试

      findall(正则,数据) --> 返回列表 查找所有

      sub(正则,替换数据,数据,次数) -- > 替换后的数据

    html ="""
    <div>
    <p>岗位职责:</p>
    <p>完成推荐算法、数据统计、接口、后台等服务器端相关工作</p>
    <p><br></p>
    <p>必备要求:</p>
    <p>良好的自我驱动力和职业素养,工作积极主动、结果导向</p>
    <p>&nbsp;<br></p>
    <p>技术要求:</p>
    <p>1、一年以上 Python 开发经验,掌握面向对象分析和设计,了解设计模式</p>
    <p>2、掌握HTTP协议,熟悉MVC、MVVM等概念以及相关WEB开发框架</p>
    <p>3、掌握关系数据库开发设计,掌握 SQL,熟练使用 MySQL/PostgreSQL 中的一种<br></p>
    <p>4、掌握NoSQL、MQ,熟练使用对应技术解决方案</p>
    <p>5、熟悉 Javascript/CSS/HTML5,JQuery、React、Vue.js</p>
    <p>&nbsp;<br></p>
    <p>加分项:</p>
    <p>大数据,数理统计,机器学习,sklearn,高性能,大并发。</p>
    
    </div>"""
    
    res = re.sub(r"</?w+>|s|&nbsp", "", html)
    print(res)
    删除制定字符案例
    def add(match_obj):
        # 获取匹配结果的数据
        value = match_obj.group()
        result = int(value) + 1
        # 返回值必须是字符串类型
        return str(result)
    
    res = re.sub(r"d{2,3}", add, "python=100 cp=96")
    print(res)
    add函数增加案例

      split(正则,数据) --> 切割后的列表 

    data = "貂蝉,杨玉环:西施,王昭君 凤姐"
    res = re.split(r",|:|s", data)
    print(res)
    切割案例

    六、贪婪,懒惰和字符r的作用

      1.贪婪和懒惰

    默认贪婪模式 尽可能多匹配-匹配结果很长

    ​懒惰 尽可能少匹配

    贪婪模式变为懒惰模式 量词后加?即可

    前提: 满足整体的匹配结果

    # html 去直播找源代码
    
    res = re.search(r"https://.+.jpg", html).group()  # 一个结果很长
    print(res)
    # res = re.search(r"https://.+?.jpg", html).group() # 一个结果很短
    # # 理解贪婪模式和非贪婪模式之后  再看下面的代码
    # print(res)
    # res = re.findall(r"https://.+?.jpg|https://.+?.png", html)
    # print(res)
    # res = re.findall(r"https://.+?.(?:jpg|png)", html)
    # print(res)
    # 取消分组 因为findall的结果默认是用户创建的分组数据  需要取消用户创建的分组从而显示整体结果(?:正则)
    网页提取直播图片
    # 验证贪婪和懒惰
    # res = re.match(r"^(d+?)(d+)$", "13546456789").group(1,2)
    # res = re.match(r"^(d+?)(d?)$", "13546456789").group(1,2)
    # res = re.match(r"^(d+)(d?)$", "13546456789").group(1,2)
    # print(res)
    验证贪婪和懒惰

      2. r

    如果字符串中有双斜杠 正则需要四反斜杠来进行匹配

    ​ 为解决反斜杠困扰问题, 使用r标识数据

    r"1" ===> "\1" 自动对数据中的进行转义 ——> 双反斜杠

  • 相关阅读:
    策略模式(Strategy Pattern)
    责任链模式(Chain of Responsibility Pattern)
    单例模式(Singleton Pattern)
    观察者模式(Observer Pattern)
    iOS常用工具类
    iOS常用的封装方法
    iOS中书写代码规范
    UITableViewCell中的使用cell和cell.contentView的区别
    colorWithAlphaComponent
    iOS 压缩图片
  • 原文地址:https://www.cnblogs.com/Mryang123/p/10013646.html
Copyright © 2020-2023  润新知