Python 正则表达式完全指南

news2025/1/12 23:29:32

# Python 正则表达式完全指南

正则表达式(Regular Expression)是Python中进行文本处理的强大工具。本指南将详细介绍Python中正则表达式的使用方法和实践技巧。

## 1. 基础知识

### 1.1 导入正则表达式模块

```python

import re

```

### 1.2 创建正则表达式

在Python中有两种方式创建正则表达式:

```python

# 方式1:使用原始字符串(推荐)

pattern = r'\d+'

# 方式2:普通字符串(需要额外转义)

pattern = '\\d+'

```

### 1.3 基本匹配方法

```python

import re

text = "Hello, my phone is 123-456-7890"

# 1. re.match() - 从字符串开始处匹配

result = re.match(r'\w+', text)

print(result.group())  # 输出: Hello

# 2. re.search() - 搜索整个字符串中的第一个匹配

result = re.search(r'\d+', text)

print(result.group())  # 输出: 123

# 3. re.findall() - 找到所有匹配项

result = re.findall(r'\d+', text)

print(result)  # 输出: ['123', '456', '7890']

# 4. re.finditer() - 返回迭代器

for match in re.finditer(r'\d+', text):

    print(f"Found {match.group()} at position {match.start()}-{match.end()}")

```

## 2. 正则表达式语法

### 2.1 字符匹配

```python

# 示例文本

text = "Python3 is awesome! Price: $99.99"

# 匹配单个字符

re.findall(r'.', text)      # 匹配任意字符

re.findall(r'\d', text)     # 匹配数字

re.findall(r'\D', text)     # 匹配非数字

re.findall(r'\w', text)     # 匹配字母/数字/下划线

re.findall(r'\W', text)     # 匹配非字母/数字/下划线

re.findall(r'\s', text)     # 匹配空白字符

re.findall(r'\S', text)     # 匹配非空白字符

```

### 2.2 数量词

```python

# 文本示例

text = "Python programming is fun!!!"

# 常用数量词

re.search(r'o*', text)      # 匹配0次或多次

re.search(r'o+', text)      # 匹配1次或多次

re.search(r'o?', text)      # 匹配0次或1次

re.search(r'o{2}', text)    # 精确匹配2次

re.search(r'o{1,3}', text)  # 匹配1到3次

```

### 2.3 字符类

```python

text = "The quick brown fox jumps over the lazy dog."

# 使用字符类

re.findall(r'[aeiou]', text)    # 匹配所有元音字母

re.findall(r'[^aeiou]', text)   # 匹配所有非元音字母

re.findall(r'[a-z]', text)      # 匹配所有小写字母

re.findall(r'[A-Z]', text)      # 匹配所有大写字母

```

## 3. 高级特性

### 3.1 分组和捕获

```python

# 分组示例

text = "John Smith, Jane Doe, Bob Johnson"

# 基本分组

pattern = r'(\w+)\s(\w+)'

matches = re.findall(pattern, text)

print(matches)  # 输出: [('John', 'Smith'), ('Jane', 'Doe'), ('Bob', 'Johnson')]

# 命名分组

pattern = r'(?P<first>\w+)\s(?P<last>\w+)'

for match in re.finditer(pattern, text):

    print(f"First: {match.group('first')}, Last: {match.group('last')}")

```

### 3.2 前向查找和后向查找

```python

text = "Price: $100, Cost: $50"

# 正向前向查找

re.findall(r'\d+(?=\s*dollars)', text)  # 匹配后面跟着"dollars"的数字

# 负向前向查找

re.findall(r'\d+(?!\s*dollars)', text)  # 匹配后面不跟"dollars"的数字

# 正向后向查找

re.findall(r'(?<=\$)\d+', text)  # 匹配前面有$的数字

# 负向后向查找

re.findall(r'(?<!\$)\d+', text)  # 匹配前面没有$的数字

```

## 4. 实用示例

### 4.1 数据验证

```python

def validate_email(email):

    """验证电子邮件地址"""

    pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'

    return bool(re.match(pattern, email))

def validate_phone(phone):

    """验证中国手机号"""

    pattern = r'^1[3-9]\d{9}$'

    return bool(re.match(pattern, phone))

def validate_password(password):

    """验证密码强度(至少8位,包含大小写字母和数字)"""

    pattern = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$'

    return bool(re.match(pattern, password))

```

### 4.2 文本处理

```python

def extract_urls(text):

    """提取文本中的URL"""

    pattern = r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+'

    return re.findall(pattern, text)

def clean_text(text):

    """清理文本(删除多余空白字符)"""

    return re.sub(r'\s+', ' ', text).strip()

def extract_dates(text):

    """提取日期(支持多种格式)"""

    pattern = r'\d{4}[-/]\d{1,2}[-/]\d{1,2}|\d{1,2}[-/]\d{1,2}[-/]\d{4}'

    return re.findall(pattern, text)

```

## 5. 性能优化技巧

### 5.1 编译正则表达式

```python

# 当需要多次使用同一个正则表达式时,应该编译它

pattern = re.compile(r'\d+')

# 使用编译后的正则表达式

text = "123 456 789"

matches = pattern.findall(text)

```

### 5.2 优化技巧

1. 使用非捕获组 `(?:)`:当不需要捕获结果时

```python

# 不好的写法

pattern = r'(https?://)(.*)'

# 好的写法

pattern = r'(?:https?://)(.*)'

```

2. 避免过度使用通配符

```python

# 不好的写法

pattern = r'.*foo.*'

# 好的写法

pattern = r'[^/]*foo[^/]*'

```

## 6. 常见问题和解决方案

### 6.1 贪婪vs非贪婪匹配

```python

text = "<p>First</p><p>Second</p>"

# 贪婪匹配(默认)

re.findall(r'<p>.*</p>', text)  # 匹配整个字符串

# 非贪婪匹配

re.findall(r'<p>.*?</p>', text)  # 分别匹配每个标签

```

### 6.2 处理特殊字符

```python

# 转义特殊字符

def escape_special_chars(text):

    return re.escape(text)

# 示例

pattern = re.escape('hello.world')  # 将点号转义

```

## 7. 调试技巧

```python

# 使用verbose模式使正则表达式更易读

pattern = re.compile(r"""

    \d+          # 匹配数字

    \s*          # 可选的空白字符

    [a-zA-Z]+    # 匹配字母

    """, re.VERBOSE)

# 使用re.DEBUG标志查看编译信息

pattern = re.compile(r'\d+\s*[a-zA-Z]+', re.DEBUG)

```

## 总结

Python的正则表达式功能强大且灵活,掌握它可以大大提高文本处理效率。关键点:

1. 合理使用原始字符串(r'')

2. 需要重复使用时记得编译正则表达式

3. 注意贪婪vs非贪婪匹配

4. 适当使用命名分组提高代码可读性

5. 考虑性能优化

6. 编写复杂正则表达式时使用verbose模式

记住:编写正则表达式时应该遵循"简单够用"的原则,过于复杂的正则表达式往往会带来维护困难和性能问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2275700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Rust自学】11.9. 单元测试

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.9.1. 测试的分类 Rust把测试分为两类&#xff0c;一个是单元测试&#xff0c;一个是集成…

【竞技宝】CS2:HLTV2024选手排名TOP4-NiKo

北京时间2025年1月11日,HLTV年度选手排名正在持续公布中,今日凌晨正式公布了今年的TOP4选手为G2(目前已转为至Falcons)战队的NiKo。 选手简介 NiKo是一名来自波黑的CS职业选手,现年26岁。作为DOTA2饱负盛名的职业选手,NiKo在CS1.6时代就已经开始征战职业赛场。2012年,年仅15岁…

rom定制系列------小米max3安卓12 miui14批量线刷 默认开启usb功能选项 插电自启等

小米Max3是小米公司于2018年7月19日发布的机型。此机型后在没有max新型号。采用全金属一体机身设计&#xff0c;配备6.9英寸全面屏.八核处理器骁龙636&#xff0c;后置双摄像头1200万500万像素&#xff0c;前置800万像素.机型代码 &#xff1a;nitrogen.官方最终版为稳定版12.5…

Linux第一课:c语言 学习记录day06

四、数组 冒泡排序 两两比较&#xff0c;第 j 个和 j1 个比较 int a[5] {5, 4, 3, 2, 1}; 第一轮&#xff1a;i 0 n&#xff1a;n个数&#xff0c;比较 n-1-i 次 4 5 3 2 1 // 第一次比较 j 0 4 3 5 2 1 // 第二次比较 j 1 4 3 2 5 1 // 第三次比较 j 2 4 3 2 1 5 // …

Cline(原Claude Dev)开源的IDE AI插件,如何搭配OpenRouter实现cursor功能,Cline怎么使用

Cline&#xff08;原Claude Dev&#xff09;是一个开源的IDE AI插件&#xff0c;可以使用你的命令行界面和编辑器的人工智能助手。 你可以直接在VS Code编辑器进行安装。如果你使用过Cursor AI IDE的话&#xff0c;可以尝试最新发布的Cline3.1版本。 在OpenRouter上&#xff0…

arcgis的合并、相交、融合、裁剪、联合、标识操作的区别和使用

1、相交 需要输入两个面要素&#xff0c;最终得到的是两个输入面要素相交部分的结果面要素。 2、合并 合并能将两个单独存放的两个要素类的内容&#xff0c;汇集到一个要素类里面。 3、融合 融合能将一个要素类内的所有元素融合成一个整体。 4、裁剪 裁剪需要输入两个面要…

【Rust自学】11.7. 按测试的名称运行测试

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.7.1. 按名称运行测试的子集 如果想要选择运行的测试&#xff0c;就将测试的名称&#xff08;一个或多个&#xff09;作为cargo test的…

利用Java爬虫获取义乌购店铺所有商品列表:技术探索与实践

在当今数字化时代&#xff0c;数据的重要性不言而喻。对于采购商和市场分析师而言&#xff0c;能够快速获取并分析供应商店铺内的所有商品信息&#xff0c;是制定有效采购策略和市场分析的关键。义乌购作为国内知名的在线批发平台&#xff0c;拥有海量的商品数据。本文将介绍如…

An FPGA-based SoC System——RISC-V On PYNQ项目复现

本文参考&#xff1a; &#x1f449; 1️⃣ 原始工程 &#x1f449; 2️⃣ 原始工程复现教程 &#x1f449; 3️⃣ RISCV工具链安装教程 1.准备工作 &#x1f447;下面以LOCATION代表本地源存储库的安装目录&#xff0c;以home/xilinx代表在PYNQ-Z2开发板上的目录 ❗ 下载Vivad…

Photoshop PS批处理操作教程(批量修改图片尺寸、参数等)

前言 ‌Photoshop批处理的主要作用‌是通过自动化处理一系列相似的操作来同时应用于多张图片&#xff0c;从而节省时间和精力&#xff0c;提高工作效率。批处理功能特别适用于需要批量处理的任务&#xff0c;如图像尺寸调整、颜色校正、水印添加等‌。 操作步骤 1.创建动作 …

互联网架构变迁:从 TCP/IP “呼叫” 到 NDN “内容分发” 的逐浪之旅

本文将给出关于互联网架构演进的一个不同视角。回顾一下互联网的核心理论基础产生的背景&#xff1a; 左边是典型的集中控制通信网络&#xff0c;很容易被摧毁&#xff0c;而右边的网络则没有单点问题&#xff0c;换句话说它很难被全部摧毁&#xff0c;与此同时&#xff0c;分…

nvim 打造成可用的IDE(2)

上一个 文章写的太长了&#xff0c; 后来再写东西 就一卡一卡的&#xff0c;所以新开一个。 主要是关于 bufferline的。 之前我的界面是这样的。 这个图标很不舒服有。 后来发现是在这里进行配置。 我也不知道&#xff0c;这个配置 我是从哪 抄过来的。 测试结果&#xff1…

drawDB docker部属

docker pull xinsodev/drawdb docker run --name some-drawdb -p 3000:80 -d xinsodev/drawdb浏览器访问&#xff1a;http://192.168.31.135:3000/

Redis--20--大Key问题解析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 大Key问题1.什么是 Redis 大 Key&#xff1f;在 Redis 中&#xff0c;大 Key 是指单个键值对的数据量非常大&#xff0c;可能包含大量数据。 2. Redis大Key的危害3.…

自动驾驶---E2E架构演进

1 背景 模型最早应用的自动驾驶模块就是感知层面&#xff0c;随着技术的发展&#xff0c;逐渐开始应用到决策规划等其它模块。端到端自动驾驶架构是一种基于深层神经网络模型和方法的自动驾驶技术模式。目前一段式端到端系统只有在英伟达早期所做的demo中实现&#xff0c;再者就…

如何优雅地绘制时序图

说到时序图&#xff0c;相信所有从事嵌入式开发的伙伴都非常熟悉&#xff0c;在各种元器件手册以及处理器说明书中&#xff0c;但凡涉及到通信、接口、交互等内容&#xff0c;都会涉及到时序图。时序图可以非常详细且明确地描述硬件及软件接口中各个信号的时序关系&#xff0c;…

SpringCloud系列教程:微服务的未来(十一)服务注册、服务发现、OpenFeign快速入门

本篇博客将通过实例演示如何在 Spring Cloud 中使用 Nacos 实现服务注册与发现&#xff0c;并使用 OpenFeign 进行服务间调用。你将学到如何搭建一个完整的微服务通信框架&#xff0c;帮助你快速开发可扩展、高效的分布式系统。 目录 前言 服务注册和发现 服务注册 ​编辑 …

WebGIS在应急灾害中对村庄、风景区、机场的影响范围应用-以日喀则市定日县地震为例

目录 前言 一、关于影响范围 1、震中距离5公里 2、震中20公里范围 3、20到80公里范围 二、空间查询知识 1、相关数据介绍 2、空间数据查询 三、前后端数据查询以及web可视化实现 1、后台API实现 2、WebGIS前端实现 四、Web成果展示 1、空间位置分析 2、包含风景区…

使用网页版Jupyter Notebook和VScode打开.ipynb文件

目录 正文 1、网页版Jupyter Notebook查看 2、VScode查看 因为总是忘记查看文件的网址&#xff0c;收藏了但分类众多每次都找不到……当个记录吧&#xff08;/捂脸哭&#xff09;&#xff01; 正文 此处以gitub中的某个仓库为例&#xff1a; https://github.com/INM-6/mu…

景联文科技提供高质量多模态数据处理服务,驱动AI新时代

在当今快速发展的AI时代&#xff0c;多模态数据标注成为推动人工智能技术进步的关键环节。景联文科技作为行业领先的AI数据服务提供商&#xff0c;专注于为客户提供高质量、高精度的多模态数据标注服务&#xff0c;涵盖图像、语音、文本、视频及3D点云等多种类型的数据。通过专…