Python 正则表达式完全指南

# 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.mzph.cn/web/65791.shtml

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

相关文章

Vue的scoped原理是什么

CSS常见模块化方案 BEM&#xff08;Block Element Modifier&#xff09;: BEM是一种流行的命名约定&#xff0c;它通过特定的命名规则来组织CSS类名&#xff0c;使得样式具有模块化、可重用性和可读性。BEM的命名规则是&#xff1a;block__element--modifier。 block&#xf…

【LC】3270. 求出数字答案

题目描述&#xff1a; 给你三个 正 整数 num1 &#xff0c;num2 和 num3 。 数字 num1 &#xff0c;num2 和 num3 的数字答案 key 是一个四位数&#xff0c;定义如下&#xff1a; 一开始&#xff0c;如果有数字 少于 四位数&#xff0c;给它补 前导 0 。答案 key 的第 i 个数…

太原理工大学软件设计与体系结构 --javaEE

这个是简答题的内容 选择题的一些老师会给你们题库&#xff0c;一些注意的点我会做出文档在这个网址 项目目录预览 - TYUT复习资料:复习资料 - GitCode 希望大家可以给我一些打赏 什么是Spring的IOC和DI IOC 是一种设计思想&#xff0c;它将对象的创建和对象之间的依赖关系…

深度学习知识点:LSTM

文章目录 1.应用现状2.发展历史3.基本结构4.LSTM和RNN的差异 1.应用现状 长短期记忆神经网络&#xff08;LSTM&#xff09;是一种特殊的循环神经网络(RNN)。原始的RNN在训练中&#xff0c;随着训练时间的加长以及网络层数的增多&#xff0c;很容易出现梯度爆炸或者梯度消失的问…

mmdet

一&#xff0c;configs/_base_ 1.default_runtime.py 2.schedule_1x.py 二&#xff0c;mmdet 1.datasets/coco.py/CocoDataset METAINFO {classes:(milk, red, spring, fanta, sprite, pepsi, king, ice, cola, scream ),# palette is a list of color tuples, which is us…

ElasticSearch 认识和安装ES

文章目录 一、为什么学ElasticSearch?1.ElasticSearch 简介2.ElasticSearch 与传统数据库的对比3.ElasticSearch 应用场景4.ElasticSearch 技术特点5.ElasticSearch 市场表现6.ElasticSearch 的发展 二、认识和安装ES1.认识 Elasticsearch&#xff08;简称 ES&#xff09;2.El…

node.js中实现token的生成与验证

Token&#xff08;令牌&#xff09;是一种用于在客户端和服务器之间安全传输信息的加密字符串。在Web开发中&#xff0c;Token常用于身份验证和授权&#xff0c;确保用户能够安全地访问受保护的资源。 作用与意义 身份验证&#xff1a;Token可以用来验证用户的身份&#xff0…

第34天:安全开发-JavaEE应用反射机制攻击链类对象成员变量方法构造方法

时间轴&#xff1a; Java反射相关类图解&#xff1a; 反射&#xff1a; 1、什么是 Java 反射 参考&#xff1a; https://xz.aliyun.com/t/9117 Java 提供了一套反射 API &#xff0c;该 API 由 Class 类与 java.lang.reflect 类库组成。 该类库包含了 Field 、 Me…

Django后端相应类设计

通用的ApiResponse类&#xff1a;用于生成统一的 API 响应格式。每个响应都包含以下字段&#xff08;每个接口最终的返回数据格式&#xff09;&#xff1a; status_code&#xff1a;HTTP 状态码&#xff08;如 200、400、500 等&#xff09;message&#xff1a;响应的描述信息…

汽车基础软件AutoSAR自学攻略(三)-AutoSAR CP分层架构(2)

汽车基础软件AutoSAR自学攻略(三)-AutoSAR CP分层架构(2) 下面我们继续来介绍AutoSAR CP分层架构&#xff0c;下面的文字和图来自AutoSAR官网目前最新的标准R24-11的分层架构手册。该手册详细讲解了AutoSAR分层架构的设计&#xff0c;下面让我们来一起学习一下。 Introductio…

css面试常考布局(圣杯布局、双飞翼布局、三栏布局、两栏布局、三角形)

两栏布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &…

模糊查询在sqlserver、dm8、mysql的编写示例

模糊查询要求&#xff1a;字段值以 25D 开头&#xff0c;并以 4 位数字结尾 sqlserver&#xff1a; select * from table_name where column_name like 25D[0-9][0-9][0-9][0-9] 说明&#xff1a; 25D&#xff1a;表示字符串以 25D 开头。 [0-9][0-9][0-9][0-9]&#xf…

SCTNet模型详解及代码复现

模型背景 随着深度学习技术的发展,语义分割领域取得了显著进展。然而,在实际应用中,特别是在实时场景下,现有模型往往面临计算复杂度高、难以平衡精度和速度等问题。为应对这些挑战,研究人员提出了SCTNet模型,旨在解决实时语义分割问题,同时兼顾精度和效率。该模型融合…

Python的循环

Python的循环 Python的循环有两种&#xff0c;分别是for…in循环和while循环。 for…in 循环 假设我们要循环输出一个列表里的元素&#xff1a; names [张三,李四,王五] for name in names:print(name)执行这段代码后&#xff0c;会依次打印names的每一个元素&#xff1a;…

【0387】Postgres内核 streaming replication(流复制)工作原理

1. Postgres 流复制 本文是关于设置 PostgreSQL 版本流复制的简明指南,力求尽可能不受平台限制。故而,其假定您拥有运用操作系统工具编辑文件及安装/配置软件包的扎实知识。并且,还假定您熟悉 PostgreSQL 的配置情况。 PostgreSQL 内置的流复制为您的数据库构建了一个服务…

网络攻击行为可视化分析系统【数据分析 + 可视化】

一、系统背景 随着信息技术的快速发展&#xff0c;网络已成为现代社会不可或缺的一部分。然而&#xff0c;与此同时&#xff0c;网络攻击手段也日益多样化和复杂化&#xff0c;给企业和个人的信息安全带来了极大的威胁。传统的网络攻击分析方法往往依赖于人工分析和处理大量的…

利用obs studio制作(人像+屏幕)录制影像

1.什么是obs? OBS&#xff08;Open Broadcaster Software&#xff09;是一款功能强大的开源软件&#xff0c;它使用户能够直接从电脑录制视频和直播内容到 Twitch&#xff0c;YouTube 和 Facebook Live 等平台。它在需要直播或录制屏幕活动的游戏玩家、YouTube 用户和专业人士…

蠕虫病毒会给服务器造成哪些危害?

蠕虫病毒是一种独立的恶意计算机程序&#xff0c;可以进行自我复制来传播到其他的计算机系统当中&#xff0c;蠕虫病毒和传统病毒之间是有着区别的&#xff0c;蠕虫病毒不需要宿主程序就能够自行传播&#xff0c;主要是利用各种操作系统漏洞进行攻击的。 接下来小编就介绍一下蠕…

C# GDI+的DrawString无法绘制Tab键的现象

【啰嗦2句】 现在用C#的人很少了吧&#xff1f;GDI更少了吧&#xff1f;所以这个问题估计也冷门。没关系&#xff0c;分享给特定需要的人也不错。 【问题现象】 工作中开发了一个报告编辑器&#xff0c;实现图文排版等功能&#xff0c;用着没什么问题&#xff0c;直到有一天…

互斥信号量的等待与通知

目录 等待互斥信号量 信号量未被占用 信号量被自己占用 信号量被高优先级任务占用 信号量被低优先级任务占用 释放互斥信号量 未发生优先级继承 发生优先级继承 等待互斥信号量 信号量未被占用 标记为已经被占用锁定计数1 信号量被自己占用 锁定计数1 信号量被高优先级任务占用…