Python中正则表达式的使用

server/2024/10/23 7:22:06/

下面介绍正则表达式的基础知识和使用方法。

  1. 正则表达式是什么?
    正则表达式(Regular Expression,简称regex)是一种用于匹配字符串模式的强大工具。就像是一种特殊的搜索语言。

  2. Python中使用正则表达式的基本步骤:

python">import re  # 首先导入re模块# 基本使用方法
pattern = r'你要匹配的模式'  # r表示原始字符串
text = "要搜索的文本"
result = re.findall(pattern, text)  # 查找所有匹配
  1. 常用的正则表达式语法:
python"># 基础匹配符号
. → 匹配任意单个字符(除了换行符)
* → 匹配前面的字符0次或多次
+ → 匹配前面的字符1次或多次
? → 匹配前面的字符0次或1^ → 匹配字符串的开始
$ → 匹配字符串的结束# 示例1:匹配电话号码
pattern = r'\d{11}'  # \d表示数字,{11}表示重复11次
phone = "我的电话是13812345678"
result = re.findall(pattern, phone)
print(result)  # ['13812345678']# 示例2:匹配邮箱
pattern = r'\w+@\w+\.\w+'  # \w表示字母数字下划线
email = "联系我:test@example.com"
result = re.findall(pattern, email)
print(result)  # ['test@example.com']
  1. 分组和引用(这就是我们AABB模式中用到的):
python"># ()表示分组,\1表示引用第一个分组
# 示例:匹配重复的字符
pattern = r'(.)(\1)'  # 匹配连续重复的任意字符
text = "书书信信"
result = re.findall(pattern, text)
print(result)  # [('书', '书'), ('信', '信')]# AABB模式的解释
pattern = r'(.)(\1)(.)(\3)'
# (.) 捕获第一个字符,作为第一个分组
# (\1) 引用第一个分组的内容(必须相同)
# (.) 捕获第三个字符,作为第三个分组
# (\3) 引用第三个分组的内容(必须相同)
  1. 常用的正则表达式方法:
python">import retext = "Python编程很有趣"# 查找所有匹配
re.findall(pattern, text)  # 返回所有匹配的列表# 查找第一个匹配
re.search(pattern, text)   # 返回第一个匹配的对象# 替换匹配的文本
re.sub(pattern, replacement, text)  # 返回替换后的字符串# 分割字符串
re.split(pattern, text)    # 返回分割后的列表
  1. 实用小例子:
python"># 例1:提取所有数字
text = "我今年25岁,电话是13812345678"
numbers = re.findall(r'\d+', text)
print(numbers)  # ['25', '13812345678']# 例2:匹配中文字符
text = "Hello你好World世界"
chinese = re.findall(r'[\u4e00-\u9fa5]+', text)
print(chinese)  # ['你好', '世界']# 例3:验证简单的邮箱格式
def is_valid_email(email):pattern = r'^[\w\.-]+@[\w\.-]+\.\w+$'return bool(re.match(pattern, email))print(is_valid_email("test@example.com"))  # True
print(is_valid_email("invalid.email"))     # False

让我们回到AABB模式的例子:

python"># AABB模式的详细解释
text = "蒙蒙胧胧的天空,匆匆忙忙地走了"
pattern = r'(.)(\1)(.)(\3)'# 分解说明
# (.) 第一个字符(比如'蒙')
# (\1) 重复第一个字符(又一个'蒙')
# (.) 第三个字符(比如'胧')
# (\3) 重复第三个字符(又一个'胧')matches = re.findall(pattern, text)
for match in matches:print(''.join(match))  # 输出:蒙蒙胧胧 匆匆忙忙

这些是正则表达式的基础用法。


正则表达式中常用字符与作用的对照

1. 特殊字符类:

\d → 匹配任意数字 (等同于[0-9])
\D → 匹配任意非数字 (等同于[^0-9])
\w → 匹配字母、数字、下划线 (等同于[a-zA-Z0-9_])
\W → 匹配非字母、数字、下划线 (等同于[^a-zA-Z0-9_])
\s → 匹配任意空白字符(空格、制表符、换行符等)
\S → 匹配任意非空白字符

2. 数量限定符:

* → 匹配前面的字符 0次或多次 (等同于{0,})
+ → 匹配前面的字符 1次或多次 (等同于{1,})
? → 匹配前面的字符 0次或1次 (等同于{0,1})
{n} → 精确匹配 n 次
{n,} → 匹配 n 次或更多次
{n,m} → 匹配 n 到 m 次

3. 边界匹配:

^ → 匹配字符串开头
$ → 匹配字符串结尾
\b → 匹配单词边界
\B → 匹配非单词边界

4. 常用特殊字符:

. → 匹配除换行符外的任意字符
\ → 转义字符
| → 或运算符(选择)
() → 分组
[] → 字符类,匹配其中的任意一个字符
[^] → 否定字符类,匹配除其中字符外的任意字符

5. 实例说明:

python"># 手机号码匹配
pattern = r'1\d{10}'  # 1开头后跟10个数字# 邮箱匹配
pattern = r'\w+@\w+\.\w+'  # 若干字母数字_@若干字母数字_.若干字母数字_# 中文匹配
pattern = r'[\u4e00-\u9fa5]'  # 匹配一个中文字符# 提取网址
pattern = r'https?://\S+'  # http或https开头,后跟://和非空白字符# 匹配日期格式
pattern = r'\d{4}-\d{2}-\d{2}'  # 类似2024-03-21的格式

6. 实用组合示例:

python">import re# 示例1:提取文本中的所有数字
text = "我的电话是13912345678,邮编是100081"
numbers = re.findall(r'\d+', text)
print(numbers)  # ['13912345678', '100081']# 示例2:匹配单词
text = "Hello_world Python123 测试"
words = re.findall(r'\w+', text)
print(words)  # ['Hello_world', 'Python123']# 示例3:分割字符串
text = "姓名:张三;年龄:25;职业:程序员"
info = re.split(r'[;:]', text)
print(info)  # ['姓名', '张三', '年龄', '25', '职业', '程序员']

7. 常见用途表:

用途模式说明
电话号码\d{11}11位数字
简单邮箱\w+@\w+\.\w+用户名@域名.顶级域名
日期\d{4}-\d{2}-\d{2}年-月-日格式
中文字符[\u4e00-\u9fa5]匹配单个中文
网址https?://\S+http或https开头的网址
邮政编码\d{6}6位数字

记忆技巧:

  1. \d (digit): 想象成"数字"的首字母
  2. \w (word): 想象成"单词"的首字母
  3. \s (space): 想象成"空格"的首字母
  4. 大写字母(如\D, \W, \S)表示对应小写的反义

http://www.ppmy.cn/server/134109.html

相关文章

力扣3185.构成整天的下标对数

给你一个整数数组 hours&#xff0c;表示以 小时 为单位的时间&#xff0c;返回一个整数&#xff0c;表示满足 i < j 且 hours[i] hours[j] 构成 整天 的下标对 i, j 的数目。 整天 定义为时间持续时间是 24 小时的 整数倍 。 例如&#xff0c;1 天是 24 小时&#xff0c…

【Flutter】Dart:库

在 Dart 中&#xff0c;库&#xff08;Library&#xff09;是组织和重用代码的基本方式。通过库&#xff0c;我们可以将代码分割成模块化的部分&#xff0c;方便管理和共享&#xff0c;同时避免命名冲突。Dart 提供了大量内置库&#xff0c;用于支持常见的功能&#xff0c;比如…

Unable to open nested entry ‘********.jar‘ 问题解决

今天把现网版本的task的jar拖回来然后用7-zip打开拖了一个jar进去替换mysql-connector-java-5.1.47.jar 为 mysql-connector-java-5.1.27.jar 启动微服务的时候就报错下面的 Exception in thread "main" java.lang.IllegalStateException: Failed to get nested ar…

商汤科技十周年公布新战略,将无缝集成算力、模型及应用

10月18日&#xff0c;恰逢商汤科技十周年庆典&#xff0c;“2024商汤十周年国际论坛&#xff1a;迈向AI 2.0共融新时代”在香港科学园成功举办。 据「TMT星球」了解&#xff0c;来自全球的行业领袖、政府代表、AI专家共聚于此&#xff0c;共同探讨AI行业的未来。 活动上&…

【电商项目--大数据治理】

电商项目的大数据治理涉及到数据的采集与存储、数据的加工与分析、数据的可视化与应用等方面。以下是一些开展大数据治理工作的建议&#xff1a; 制定数据治理策略&#xff1a;确定数据治理的目标、原则和流程&#xff0c;明确数据的采集、存储、加工和应用等环节的责任和权限&…

算法:KMP算法详解

朴素的BF算法 BF算法即暴力求解字符串匹配的算法 面对这样两个字符串&#xff0c; BF算法就是用两个指针&#xff0c;一个i&#xff0c;一个j&#xff0c;分别从s和t的开始位置开始依次匹配 当遇到s[i] t[0]的时候&#xff0c;此时有可能字符串匹配&#xff0c;需要进行检查…

线性可分支持向量机的原理推导 9-32线性分类超平面的位置 公式解析

本文是将文章《线性可分支持向量机的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 公式 9-32 是线性可分支持向量机&#xff08;SVM&#xff09;中的一个关键公式&#xff0c;用于表达线性分类超平面的位置。通过这个公式&#xff0c;我们…

Scrapy | Scrapy框架中管道的使用

管道的使用 基本使用如何在管道中区分不同的爬虫 在Scrapy中&#xff0c;爬虫管道&#xff08;Item Pipeline&#xff09;是用于处理Spider提取的数据的一系列组件。它们的主要职责是清洗、验证和存储爬取的数据。每个管道组件是一个Python类&#xff0c;这些类必须定义一个pro…