当前位置: 首页 > news >正文

正则表达式

一、正则表达式基础语法

1. 普通字符与元字符

  • 普通字符:直接匹配字面值(如 a 匹配字符 a)。
  • 元字符:具有特殊含义,需转义使用(如 \d 匹配数字,\w 匹配字母、数字、下划线)。
    • 边界匹配符:
      ^(字符串开头)、$(字符串结尾)、\b(单词边界,如 java\b 匹配独立单词 java)。
    • 点号 .:匹配除换行符外的任意字符(默认),配合 s 修饰符可匹配换行符。

2. 预定义字符集

元字符匹配内容示例
\d数字(等价于 [0-9]\d+ 匹配连续数字
\D非数字(等价于 [^0-9]\D* 匹配非数字序列
\w单词字符(字母、数字、下划线)\w{3,} 匹配3-15位用户名
\s空白字符(空格、制表符等)\s+ 匹配连续空格

3. 量词

  • *:匹配0次或多次(如 a* 匹配空字符串或多个 a)。
  • +:匹配1次或多次(如 a+ 至少匹配一个 a)。
  • ?:匹配0次或1次(如 a? 可选 a)。
  • {n,m}:匹配n到m次(如 \d{3,5} 匹配3-5位数字)。

二、正则表达式核心功能

  1. 验证字符串
    通过模式匹配检查输入合法性,如邮箱、电话号码格式。
    import re
    pattern = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
    re.match(pattern, "user@example.com")  # 验证邮箱
    
  2. 查找与替换
    • findall():返回所有匹配项(如提取文本中的数字)。
    • sub():替换匹配内容(如将逗号替换为分号)。
    text = "Date: 2023-04-15, Time: 14:30"
    date_time = re.search(r"Date: (\d{4}-\d{2}-\d{2}), Time: (\d{2}:\d{2})", text)
    print(date_time.groups())  # 输出 ('2023-04-15', '14:30')
    
  3. 分组与捕获
    使用 () 分组,提取特定部分(如从URL中提取路径)。
    url = "https://example.com/path/to/page"
    match = re.match(r"https://(.*)/(\w+)", url)
    print(match.group(1))  # 输出 example.com/path/to
    print(match.group(2))  # 输出 page
    

三、修饰符与高级特性

  1. 常用修饰符
    • i:忽略大小写(如 Aa 均匹配)。
    • g:全局匹配(返回所有匹配项)。
    • m:多行模式(^$ 匹配每行的开头和结尾)。
    • s:点号匹配换行符。
  2. 非贪婪匹配
    添加 ? 实现最小匹配(如 a.*?b 匹配 a...b 中最短的部分)。

四、应用场景示例

  1. 数据提取
    从日志中提取时间戳:
    text = "2023-04-15T14:30:00 Error: Invalid input"
    date = re.search(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}", text).group()
    
  2. 文本格式化
    自动替换标点符号:
    text = "Hello, World! 你好,世界!"
    new_text = re.sub(r"[,!]}", " ", text)  # 输出 "Hello  World  你好  世界!"
    
  3. 网页数据抓取
    提取HTML中的链接:
    html = "Link"
    links = re.findall(r"href='([^']*)'", html)  # 输出 ['https://example.com']
    

五、常见问题与优化

  1. 转义字符
    元字符(如 .*)需转义为 \.\*
  2. 性能优化
    • 避免过度使用 .*,优先使用精确匹配(如 \d{4} 代替 .*)。
    • 预编译正则表达式(如 re.compile(pattern))提升多次调用效率。

六、总结

正则表达式是处理文本数据的高效工具,适用于验证、查找、替换和提取等场景。掌握其核心语法(元字符、量词、分组)和修饰符(ig)可显著提升开发效率。实际应用中需注意转义规则和性能优化,结合具体语言的库(如Python的 re 模块)实现功能。

http://www.xdnf.cn/news/83521.html

相关文章:

  • 【AAudio】A2dp sink创建音频轨道的源码流程分析
  • 【OSG源码阅读】Day 1: 从Viewer的run函数开始
  • Sentinel数据S2_SR_HARMONIZED连续云掩膜+中位数合成
  • Spark-SQL(总结)
  • Saliency Driven Perceptual Image Compression阅读
  • 如何解决消费者高频触发订单更新?
  • ProxySQL 的性能优化需结合实时监控数据与动态配置调整
  • pip install torchsummary报错
  • 5个Go接口常见错误及避免方法
  • 机器学习基础 - 分类模型之逻辑回归
  • 是否可以使用非被动 S4P 文件进行反嵌?
  • Redis—内存淘汰策略
  • Nginx:前后端分离配置(静态资源+反向代理)
  • AI算子开发是什么
  • CMake
  • 第48讲:空间大数据与智慧农业——时空大数据分析与农业物联网的融合实践
  • 数据库介绍
  • Eureka、LoadBalance和Nacos
  • 作为一个创业团队,Neo4j、Nebula Graph、HugeGraph‌、AllegroGraph‌等几款图数据库哪款更合适?
  • 【漫话机器学习系列】215.处理高度不平衡数据策略(Strategies For Highly Imbalanced Classes)
  • AI写代码之GO+Python写个爬虫系统
  • 基于 PaddleOCR对pdf文件中的文字提取
  • 深度学习4月22笔记
  • [翻译]从 unique 到 cleanups 和 weak:高效的新底层工具
  • 生产环境大数据平台权限管理
  • Neo4j 可观测性最佳实践
  • Vue指令详解:从入门到精通
  • BBR 的 minRTT 采集问题
  • 二叉树层序遍历技术解析与面试指南
  • 根据极点-零点分布进行状态空间模型降阶