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

Python正则表达式完全指南:从入门到精通

一、正则表达式简介

正则表达式(Regular Expression)是用于匹配和处理文本的强大工具,通过特定语法规则实现:

  • 文本搜索与匹配

  • 数据验证(邮箱、电话等)

  • 文本替换与清洗

  • 复杂模式提取

  • 文本分割

Python通过内置的re模块提供正则支持,我们先导入模块:

python

复制

import re

二、基础语法详解

1. 字符匹配

模式描述示例
普通字符精确匹配python
.匹配任意单个字符p.th.n
\d数字(等价[0-9])\d{3}
\D非数字\D+
\w单词字符([a-zA-Z0-9_])\w{4,}
\W非单词字符\W
\s空白字符(空格、换行等)\s+
\S非空白字符\S

2. 量词与重复

量词描述示例
*0次或多次a*b → "b", "aaab"
+1次或多次a+b → "ab", "aaab"
?0次或1次colou?r → "color", "colour"
{n}精确n次\d{4} → 4位数字
{n,}至少n次\w{3,} → 至少3个字符
{n,m}n到m次a{2,4} → "aa", "aaaa"

3. 字符集合

python

复制

[aeiou]    # 匹配任意元音
[^0-9]     # 非数字字符
[a-zA-Z]   # 所有字母
[0-9a-fA-F] # 十六进制字符

4. 定位符

符号描述示例
^字符串开始^Start
$字符串结束end$
\b单词边界\bword\b
\B非单词边界\Bword\B

5. 转义字符

使用\转义特殊字符:

python

复制

\. 匹配点号
\\ 匹配反斜杠
\* 匹配星号

三、Python re模块核心方法

1. 常用方法

方法描述
re.match()从字符串起始位置匹配
re.search()扫描整个字符串查找匹配
re.findall()返回所有匹配的列表
re.finditer()返回匹配迭代器
re.sub()替换匹配内容
re.split()按模式分割字符串

2. 匹配示例

python

复制

# 验证手机号
pattern = r'^1[3-9]\d{9}$'
phone = "13812345678"
if re.match(pattern, phone):
    print("Valid phone number")

# 提取所有日期
text = "2023-08-15, 2024-12-31"
dates = re.findall(r'\d{4}-\d{2}-\d{2}', text)
print(dates)  # ['2023-08-15', '2024-12-31']

四、高级技巧

1. 分组与捕获

python

复制

# 捕获分组
pattern = r'(\d{4})-(\d{2})-(\d{2})'
match = re.search(pattern, "Date: 2023-08-15")
if match:
    print(f"Year: {match.group(1)}, Month: {match.group(2)}")

# 非捕获分组(?:)
pattern = r'(?:\d{3})-(\d{4})'  # 不捕获前3位

2. 贪婪与非贪婪匹配

python

复制

# 贪婪匹配(默认)
re.findall(r'<.*>', '<div>text</div>')  # 匹配整个字符串

# 非贪婪匹配(加?)
re.findall(r'<.*?>', '<div>text</div>')  # ['<div>', '</div>']

3. 断言(Lookaround)

断言类型语法示例
正向先行断言(?=...)\d+(?=元) → "100" in "100元"
负向先行断言(?!...)\d{3}(?!-)\d{4} → 禁止连字符
正向后行断言(?<=...)(?<=\$)\d+ → "99" in "$99"
负向后行断言(?<!...)(?<!-)\d{5} → 排除以-开头的数字

五、最佳实践与优化

1. 使用编译模式

python

复制

pattern = re.compile(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b')
emails = pattern.findall(text)

2. 性能优化技巧

  • 避免过度使用回溯:.* → 改用更具体的模式

  • 使用非捕获组:(?:...)代替(...)

  • 预编译常用正则表达式

  • 尽量使用具体字符集代替.

3. 常见问题解决

问题:匹配包含特殊字符的文本

python

复制

# 使用re.escape自动转义
danger_str = "file[1].txt"
safe_pattern = re.escape(danger_str) + r'_\d+'

问题:多行匹配

python

复制

text = """Start
Content line1
Content line2
End"""
re.findall(r'^Content.*', text, re.MULTILINE)

六、实用案例集合

1. 邮箱验证

python

复制

pattern = r'''
    ^                   # 开始
    [\w.%+-]+           # 用户名
    @                   
    [\w.-]+             # 域名
    \.                  
    [a-zA-Z]{2,}        # 顶级域名
    $                   # 结束
'''
re.compile(pattern, re.VERBOSE)

2. 提取HTML链接

python

复制

html = '<a href="https://example.com">Link</a>'
links = re.findall(r'href=["\'](.*?)["\']', html)

3. 密码强度验证

python

复制

# 要求:8-20位,包含大小写字母和数字
pattern = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[\w!@#$%^&*]{8,20}$'

七、工具与资源推荐

  1. 在线测试工具:

    • RegExr

    • Regex101

  2. 可视化工具:

    • Regexper

  3. 进阶学习:

    • 《精通正则表达式》

    • Python官方re模块文档


通过本教程,您已掌握Python正则表达式的核心知识与实用技巧。建议通过实际项目练习巩固,遇到复杂匹配时逐步拆解模式,善用测试工具进行验证。正则表达式需要实践积累,持续练习将助您成为文本处理高手!


http://www.kler.cn/a/579598.html

相关文章:

  • 【Linux网络(一)】初始网络
  • Linux:多线程(单例模式,其他常见的锁,读者写者问题)
  • ESP8266UDP透传
  • 华为Mate 60 Pro+ 等机型适配支持运营商北斗卫星短信功能
  • C++:vector容器(下篇)
  • Milvus的匹配语法
  • 二维码识别OCR接口:开启高效信息提取的新篇章
  • RK Android14 在计算器内输入特定字符跳转到其他应用
  • 文件上传漏洞测试
  • Java 大视界 -- Java 大数据在智慧交通信号灯智能控制中的应用(116)
  • TCP/IP 5层协议簇:网络层(ICMP协议)
  • 论文阅读-秦汉时期北方边疆组织的空间互动模式与直道的定位(中国)
  • 自学微信小程序的第十二天
  • lodash手写源码-cloneDeep,debounce,throttle
  • 【并发】 synchronized 关键字详解
  • 实现一键不同环境迁移ES模板
  • Mysql配置文件My.cnf(my.ini)配置参数说明
  • 如何判断住宅IP与机房IP的方法
  • 双击PPT文件界面灰色不可用,需要再次打开该PPT文件才能正常打开
  • vue基本功