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

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

相关文章:

  • 使用AI一步一步实现若依前端(5)
  • Catia 转 StL:打通数字化设计与制造的关键纽带
  • TCP并发服务器
  • Vue 实现智能检测文字是否溢出,溢出显示省略号,鼠标悬浮显示全部【附封装组件完整代码+详细注释+粘贴即食】
  • Vue前端开发-Coupon组件
  • javaweb自用笔记:请求参数、响应、分层解耦、
  • 一二三应用开发平台——能力扩展:多数据源支持
  • 模板方法模式的C++实现示例
  • React基础之项目实战
  • 贵工程寝室报修系统的设计与实现
  • JavaScript 变量与常量全面解析
  • 在线程间共享数据_第三章_《C++并发编程》笔记
  • 什么是Flask
  • spring6概述
  • HTML 基础
  • el-pagination的使用说明
  • STM32---FreeRTOS消息队列
  • HarmonyOS学习第18天:多媒体功能全解析
  • day19-前端Web——Vue3+TS+ElementPlus
  • vue3 二次封装uni-ui中的组件,并且组件中有 v-model 的解决方法
  • 破题“省会担当”,南京如何走好自己的路?
  • 大语言模型在线辩论说服力比人类辩手高出64%
  • 鸿蒙电脑正式发布,余承东:国产软件起步晚,基础弱,探索面向未来的电脑体验
  • 波兰总统选举第一轮投票结束,出口民调显示将进入第二轮投票
  • 国际观察丨美中东政策生变,以色列面临艰难选择
  • 体育文化赋能国际交流,上海黄浦举办国际友人城市定向赛