Python:正则表达式

06-01 777阅读

正则表达式的基础和应用

一、正则表达式核心语法(四大基石)

1. ​元字符(特殊符号)​
  • ​定位符

    ^:匹配字符串开始位置

    $:匹配字符串结束位置

    \b:匹配单词边界​(如 \bword\b 匹配独立单词)

  • ​字符类

    .:任意单个字符(默认不包括换行符)

    \d:数字(等价 [0-9])

    \w:字母、数字、下划线(等价 [a-zA-Z0-9_])

    \s:空白符(空格、Tab、换行等)

  • ​转义符

    \:将特殊字符转为普通字符(如 \. 匹配真正的点号)

    2. ​量词(重复次数)​
    • *:0次或多次
    • +:1次或多次
    • ?:0次或1次
    • {n}:精确n次
    • {n,}:至少n次
    • {n,m}:n到m次
      3. ​字符集合与逻辑
      • [abc]:匹配a、b、c中的任意一个
      • [a-z]:匹配小写字母a到z
      • [^abc]:否定集合(匹配不在abc中的字符)
      • |:逻辑或(如 cat|dog 匹配"cat"或"dog")
        4. ​分组与引用
        • ( ):捕获分组(可通过 \1 或 $1 反向引用)
        • (?: ):非捕获分组(仅用于逻辑分组)
        • (?P):命名分组(Python中可通过名称引用)

          二、正则引擎工作原理(NFA vs DFA)

          1. ​NFA引擎(主流实现)​
          • ​特点:支持回溯、捕获组、零宽断言等高级功能,但存在性能风险
          • ​匹配流程:
            1. 从起始位置尝试匹配
            2. 记录所有可能的分支(回溯点)
            3. 失败时退回最近回溯点继续尝试
            4. 直到匹配成功或完全失败
            2. ​DFA引擎
            • ​特点:无回溯,线性时间复杂度,但功能受限(不支持分组引用)
            • ​流程:一次性扫描文本,无状态回退

              三、关键应用场景与解决方案

              1. ​数据验证(精准匹配)​
              • ​邮箱验证

                ^[\w\.-]+@([\w-]+\.)+[\w-]{2,4}$  
                • ^ 和 $ 确保整行匹配
                • [\w\.-]+ 允许用户名包含字母、数字、点、减号
                • ([\w-]+\.)+ 匹配多级域名(如 "mail." 或 "google.com.")
                • [\w-]{2,4} 匹配顶级域名(如 com、org)
                • ​强密码规则

                  ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$  
                  • (?=.*\d):正向预查确保包含数字
                  • (?=.*[a-z]):必须有小写字母
                  • (?=.*[A-Z]):必须有大写字母
                  • .{8,}:总长度至少8位
                    2. ​数据提取(捕获关键信息)​
                    • ​从URL提取域名和路径

                      ^https?://([^/?#]+)([^?#]*)  
                      • 分组1 ([^/?#]+) 捕获域名(如 www.example.com)
                      • 分组2 ([^?#]*) 捕获路径(如 /path/to/page)
                      • ​日志时间戳提取

                        \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}
                        • 精确匹配 YYYY-MM-DD HH:MM:SS 格式
                          3. ​文本清洗与替换
                          • ​删除HTML标签

                            ]+>  
                            • 匹配所有以  结尾的内容
                            • 使用 re.sub(r']+>', '', html) 替换为空
                            • ​格式化电话号码

                              输入:1234567890 → 输出:(123) 456-7890

                              Python:正则表达式
                              (图片来源网络,侵删)
                              re.sub(r'(\d{3})(\d{3})(\d{4})', r'(\1) \2-\3', phone)

                              四、性能优化与避坑指南

                              1. ​避免灾难性回溯
                              • ​危险模式:(a+)+ 或 .*.*(嵌套量词导致指数级复杂度)
                              • ​优化方法:
                                • 用具体字符代替 .*(如 \d+ 代替 .*)
                                • 使用原子分组 (?>...)(部分引擎支持)
                                • 添加锚点限制范围(如 ^...$)
                                  2. ​贪婪与非贪婪选择
                                  • ​贪婪模式​(默认):.* 匹配尽可能多内容
                                    .* → 可能跨多个标签错误匹配
                                  • ​非贪婪模式:.*? 匹配最短结果
                                    .*? → 精确匹配单个标签内容
                                    3. ​预编译与复用
                                    # 预编译提升性能(适用于频繁调用场景)
                                    pattern = re.compile(r'\d{3}-\d{4}')
                                    pattern.findall('Tel: 123-4567')

                                    五、进阶技巧

                                    1. ​零宽断言(Lookaround)​
                                    • (?=...):正向先行断言(右侧必须满足条件)
                                      \d+(?=px) → 匹配 "100px" 中的 "100"
                                    • (?
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码