news 2026/4/16 18:25:39

一文搞定 Python 正则表达式:常用场景速查表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一文搞定 Python 正则表达式:常用场景速查表

在Python编程中,正则表达式(Regular Expression,简称regex)是处理字符串的瑞士军刀。无论是数据清洗、日志分析,还是爬虫开发,正则表达式都能以简洁高效的方式解决复杂字符串匹配问题。本文通过20个真实场景案例,带你快速掌握正则表达式的核心用法。

一、基础验证场景

1. 邮箱地址验证

import re def validate_email(email): pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$' return bool(re.match(pattern, email)) print(validate_email("test@example.com")) # True print(validate_email("invalid.email")) # False

关键点^$确保从头到尾匹配,[a-zA-Z0-9._%+-]匹配用户名部分,\.转义点号,{2,}要求顶级域名至少2个字符。

2. 手机号码校验(中国大陆)

def validate_phone(phone): pattern = r'^1[3-9]\d{9}$' return bool(re.match(pattern, phone)) print(validate_phone("13800138000")) # True print(validate_phone("12345678901")) # False

技巧1[3-9]匹配运营商号段,\d{9}匹配剩余9位数字,总长度固定11位。

3. 密码强度检测

def validate_password(password): pattern = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,20}$' return bool(re.match(pattern, password)) print(validate_password("StrongPass1!")) # True print(validate_password("weakpass")) # False

原理(?=...)是正向预查,确保同时包含大小写字母、数字和特殊字符,{8,20}限制长度。

二、数据提取场景

4. 从文本提取所有数字

text = "订单号: 2023A001, 金额: ¥128.50" numbers = re.findall(r'\d+\.?\d*', text) print(numbers) # ['2023', '001', '128.50']

扩展:若需提取整数,改用r'\b\d+\b';提取小数用r'\d+\.\d+'

5. 抓取网页URL

html = '<a href="https://example.com">链接</a> <img src="image.png">' urls = re.findall(r'href="(https?://[^"]+)"', html) print(urls) # ['https://example.com']

优化:添加re.IGNORECASE标志可匹配HTTPHTTPS混合大小写情况。

6. 解析日志文件

log = "2023-10-01 12:00:00 ERROR: Disk full" match = re.search(r'(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) (\w+): (.+)', log) if match: print(f"日期: {match.group(1)}, 时间: {match.group(2)}, 级别: {match.group(3)}, 内容: {match.group(4)}")

输出

日期: 2023-10-01, 时间: 12:00:00, 级别: ERROR, 内容: Disk full

三、文本处理场景

7. 敏感词过滤

def censor_text(text, bad_words): pattern = '|'.join(map(re.escape, bad_words)) return re.sub(pattern, '***', text) text = "这个产品太糟糕了,服务态度极差" print(censor_text(text, ["糟糕", "极差"])) # 这个产品太***了,服务态度***

注意re.escape自动转义特殊字符,避免正则语法错误。

8. 拆分复合分隔符

data = "苹果|香蕉,橙子;西瓜" items = re.split(r'[|,;]', data) print(items) # ['苹果', '香蕉', '橙子', '西瓜']

应用场景:处理CSV文件或用户自定义分隔符的数据。

9. 删除多余空格

text = " This is a messy sentence. " cleaned = re.sub(r'\s+', ' ', text).strip() print(cleaned) # "This is a messy sentence."

进阶:结合re.compile()预编译模式提升性能:

space_pattern = re.compile(r'\s+') cleaned = space_pattern.sub(' ', text).strip()

四、高级匹配技巧

10. 非贪婪匹配

html = "<p>第一段</p><p>第二段</p>" content = re.findall(r'<p>(.*?)</p>', html, re.DOTALL) print(content) # ['第一段', '第二段']

对比:贪婪模式.*会匹配整个字符串,非贪婪模式.*?在遇到第一个</p>时停止。

11. 条件匹配(区分邮箱类型)

emails = ["edu@example.edu", "biz@example.biz"] for email in emails: match = re.search(r'(\w+@)(edu|biz)\.', email) if match: print(f"{email} 是{match.group(2)}邮箱")

输出

edu@example.edu 是edu邮箱 biz@example.biz 是biz邮箱

12. 提取重复字符

text = "1122334455" repeats = re.findall(r'(\d)\1+', text) print(repeats) # ['1', '2', '3', '4', '5']

原理(\d)捕获数字,\1引用第一个分组,+匹配一次或多次重复。

五、实战案例集锦

13. 身份证号校验(简易版)

def validate_id_card(id_card): pattern = r'^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dX]$' return bool(re.match(pattern, id_card)) print(validate_id_card("11010519991231003X")) # True

说明:该模式验证18位身份证号,包含地区码、出生日期和校验位。

14. 提取中文段落

text = "Hello 你好,世界!This is a test." chinese = re.findall(r'[\u4e00-\u9fa5]+', text) print(chinese) # ['你好', '世界']

扩展:匹配中文标点:r'[\u4e00-\u9fa5,。、;:?!]'

15. 爬虫代理IP格式校验

def validate_proxy(proxy): pattern = r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,5}$' return bool(re.match(pattern, proxy)) print(validate_proxy("192.168.1.1:8080")) # True print(validate_proxy("256.300.1.1:99999")) # False

注意:实际IP范围需更严格校验,此处仅演示格式。

六、性能优化建议

  1. 预编译模式:频繁使用的正则表达式应预编译:

    date_pattern = re.compile(r'^\d{4}-\d{2}-\d{2}$') date_pattern.match("2023-10-01")
  2. 避免过度捕获:非必要不使用括号分组,减少re.sub的回调函数开销。

  3. 选择合适方法

    • 只需判断是否存在匹配 →re.search()
    • 需要所有匹配结果 →re.findall()
    • 需要替换文本 →re.sub()
  4. 处理大文件:逐行读取文件并匹配,避免一次性加载全部内容。

常见问题Q&A

Q2:如何匹配中文和英文混合字符串中的中文部分?
A:使用Unicode范围匹配:

text = "Python编程 Python Programming" chinese = re.findall(r'[\u4e00-\u9fa5]+', text) print(chinese) # ['编程']

Q3:正则表达式匹配效率低如何优化?
A:

  1. 避免嵌套量词(如(a+)+
  2. 使用非贪婪模式替代贪婪模式
  3. 限制重复次数范围(如{3,6}优于*
  4. 对固定字符串使用re.escape()转义后直接匹配

Q4:如何提取HTML标签间的文本?
A:非贪婪模式匹配:

html = "<div>标题</div><p>内容</p>" texts = re.findall(r'>(.*?)</', html) print(texts) # ['标题', '内容']

Q5:正则表达式能匹配二进制数据吗?
A:不能直接匹配,但可先解码为字符串(如UTF-8),或使用bytes类型正则(Python 3中需加b前缀):

binary_data = b'\x48\x65\x6c\x6c\x6f' pattern = b'Hello' match = re.search(pattern, binary_data)

通过掌握这些核心场景和优化技巧,你已具备解决80%以上字符串处理问题的能力。正则表达式的精髓在于"用简洁的语法描述复杂规则",建议通过实际项目不断练习,最终达到"看字符串即写正则"的境界。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 11:08:32

2025最新!9个AI论文工具测评:继续教育科研写作全攻略

2025最新&#xff01;9个AI论文工具测评&#xff1a;继续教育科研写作全攻略 2025年AI论文工具测评&#xff1a;助力科研写作高效升级 随着人工智能技术的不断进步&#xff0c;AI论文工具在学术研究中的应用愈发广泛。对于继续教育领域的学习者和研究者而言&#xff0c;如何选…

作者头像 李华
网站建设 2026/4/15 15:24:24

Open-AutoGLM部署成功率提升80%,这7个关键参数设置你调对了吗

第一章&#xff1a;Open-AutoGLM开源部署操作电脑可以吗环境准备与依赖安装 在本地电脑上部署 Open-AutoGLM 前&#xff0c;需确保系统满足基本运行条件。推荐使用 Linux 或 macOS 系统&#xff0c;Windows 用户可通过 WSL2 环境支持。首先安装 Python 3.10 及 pip 包管理工具&…

作者头像 李华
网站建设 2026/4/16 11:12:16

C语言读取文本中的图像数据转为BMP

C语言读取文本中的图像数据转为BMP 在嵌入式开发、固件分析或逆向工程中&#xff0c;经常会遇到这样的场景&#xff1a;图像数据并非以常规的 .jpg 或 .png 格式存储&#xff0c;而是被编码成十六进制字符串保存在文本文件里。比如从单片机调试日志中提取的帧缓冲区快照、OTA升…

作者头像 李华
网站建设 2026/4/16 15:54:07

Open-AutoGLM实战指南(新手必看手册)

第一章&#xff1a;Open-AutoGLM实战指南概述Open-AutoGLM 是一个面向自动化自然语言处理任务的开源框架&#xff0c;专为简化大语言模型&#xff08;LLM&#xff09;在实际业务场景中的部署与调优而设计。该框架支持任务自动拆解、提示工程优化、多模型协同调度以及执行结果验…

作者头像 李华
网站建设 2026/4/16 15:32:29

部署Open-AutoGLM需要什么配置:实测8款主流PC能否跑通AI推理

第一章&#xff1a;Open-AutoGLM开源部署操作电脑可以吗Open-AutoGLM 是一个基于 AutoGLM 架构的开源项目&#xff0c;旨在为本地化大模型推理与微提供轻量化部署方案。得益于其模块化设计和对消费级硬件的优化&#xff0c;用户完全可以在普通个人电脑上完成项目的部署与运行。…

作者头像 李华