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

正则表达式介绍和python中的简单使用

正则表达式(Regular Expression, 简称 RegEx)

正则表达式是一种用来描述字符串模式的工具,它允许你根据特定的规则来搜索、匹配、替换字符串。正则表达式通过一些特殊的符号和规则来描述字符串的匹配模式,常用于文本搜索、替换、验证和提取。

Python 提供了 re 模块来支持正则表达式的使用,允许用户进行模式匹配、搜索、替换等操作。

正则表达式的基本组成部分

正则表达式包括以下几类常见元素:

1. 元字符(Metacharacters)

元字符是正则表达式中具有特殊含义的字符,它们通常用于定义模式匹配的规则。

  • .:匹配除换行符以外的任何字符。
  • ^:匹配字符串的开始。
  • $:匹配字符串的结束。
  • *:匹配前面的元素零次或多次。
  • +:匹配前面的元素一次或多次。
  • ?:匹配前面的元素零次或一次。
  • {n}:匹配前面的元素恰好 n 次。
  • {n,}:匹配前面的元素至少 n 次。
  • {n,m}:匹配前面的元素至少 n 次,但不超过 m 次。
  • []:匹配方括号中的字符集中的任何一个字符(字符集)。
  • |:表示"或"的意思,匹配左右任意一个表达式。
  • ():用于分组匹配,提取匹配的部分。
2. 常见的字符集(Character Classes)
  • \d:匹配任何数字,等价于 [0-9]
  • \D:匹配任何非数字字符,等价于 [^0-9]
  • \w:匹配任何字母数字字符或下划线,等价于 [a-zA-Z0-9_]
  • \W:匹配任何非字母数字字符,等价于 [^a-zA-Z0-9_]
  • \s:匹配任何空白字符(包括空格、制表符、换行符等)。
  • \S:匹配任何非空白字符。
  • \b:匹配单词边界。
  • \B:匹配非单词边界。
3. 贪婪和非贪婪匹配
  • 贪婪匹配(Greedy Match):尽可能多地匹配字符。例如,.* 会尽量匹配尽可能多的字符。
  • 非贪婪匹配(Non-Greedy Match):尽可能少地匹配字符。通过在量词后加 ? 来实现。例如,.*? 会尽量匹配少量的字符。

常见的正则表达式例子

以下是一些常见的正则表达式及其用途:

1. 匹配电话号码

假设你要匹配常见格式的电话号码,如 (123) 456-7890,你可以使用如下正则表达式:

\(\d{3}\)\s\d{3}-\d{4}
  • \(\) 匹配括号字符。
  • \d{3} 匹配三个数字。
  • \s 匹配空白字符(通常是空格)。
  • - 匹配连字符。
2. 匹配邮箱地址

匹配简单的邮箱地址,如 user@example.com,可以使用:

[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
  • [a-zA-Z0-9._%+-]+ 匹配用户名部分,支持字母、数字、点、下划线、百分号等字符。
  • @ 匹配 @ 符号。
  • [a-zA-Z0-9.-]+ 匹配域名部分。
  • \. 匹配点号。
  • [a-zA-Z]{2,} 匹配域名的后缀,至少包含两个字母。
3. 匹配网址(URL)

匹配网址(如 https://www.example.com)的正则表达式可以是:

https?://(?:www\.)?[a-zA-Z0-9-]+\.[a-zA-Z]{2,}
  • https? 匹配 “http” 或 “https”,? 表示可选。
  • :// 匹配 “😕/”。
  • (?:www\.)? 是一个非捕获组,匹配可选的 “www.”,其中 ? 表示这一部分是可选的。
  • [a-zA-Z0-9-]+ 匹配域名部分,由字母、数字或短横线组成。
  • \. 匹配点(.)字符。
  • [a-zA-Z]{2,} 匹配顶级域名(如 .com.org),至少包含两个字母。
4. 匹配日期格式(YYYY-MM-DD)

假设你要匹配日期格式,如 2024-12-31,可以使用:

\d{4}-\d{2}-\d{2}
  • \d{4} 匹配四个数字(表示年份)。
  • - 匹配连字符。
  • \d{2} 匹配两位数字(表示月份或日期)。
5. 匹配身份证号(中国身份证)

中国的身份证号码通常为 18 位数字(可能包括字母 X)。一个常见的正则表达式是:

\d{17}[\dXx]
  • \d{17} 匹配前 17 位数字。
  • [\dXx] 匹配最后一位数字或字母 “X”(大小写均可)。
6. 匹配空白字符

匹配一个或多个空白字符(空格、制表符、换行符等):

\s+
  • \s 匹配任意空白字符。
  • + 表示匹配一个或多个。
7. 匹配所有数字

匹配一个或多个数字:

\d+
  • \d 匹配一个数字。
  • + 表示匹配一个或多个。
8. 匹配电话号码(简单格式)

匹配形如 123-456-7890 的电话号码:

\d{3}-\d{3}-\d{4}
  • \d{3} 匹配三位数字。
  • - 匹配连字符。
  • \d{4} 匹配四位数字。
9. 匹配IP地址

匹配IPv4地址,如 192.168.0.1

\b(?:\d{1,3}\.){3}\d{1,3}\b
  • \b 匹配单词边界,确保它是一个完整的 IP 地址。
  • (?:\d{1,3}\.){3} 匹配三段数字,每段数字可以是 1 至 3 位,后面跟一个点号。
  • \d{1,3} 匹配最后一段数字。
10. 匹配重复字符

查找重复的单个字符,例如两个连续的字母 aabbcc 等:

(\w)\1
  • (\w) 捕获一个字母或数字。
  • \1 引用第一个捕获组,确保后面的字符与第一个字符相同。
11. 匹配HTML标签

如果你想匹配 HTML 标签(如 <div>, </p>),可以使用:

<[^>]+>
  • <> 匹配 HTML 标签的尖括号。
  • [^>] 匹配任何非 > 字符,+ 表示匹配一个或多个。

Python 中使用正则表达式

Python 提供了 re 模块来工作与正则表达式。常见的操作包括:

1. 匹配字符串

使用 re.match()re.search() 来检查字符串是否符合正则表达式。

import re

# re.match() 匹配字符串的开始
result = re.match(r'\d{4}-\d{2}-\d{2}', '2024-12-31')
if result:
    print('匹配成功')
else:
    print('匹配失败')
# re.search() 在字符串中查找第一次匹配
result = re.search(r'\d{4}-\d{2}-\d{2}', 'Today is 2024-12-31')
if result:
    print(f"找到匹配的日期:{result.group()}")
else:
    print('没有找到匹配')
2. 查找所有匹配项

如果你需要找出字符串中所有的匹配项,可以使用 re.findall()

import re

text = "My phone numbers are 123-456-7890 and 987-654-3210."
matches = re.findall(r'\d{3}-\d{3}-\d{4}', text)
print(f"找到的电话号码:{matches}")
3. 替换字符串中的内容

使用 re.sub() 来替换字符串中的匹配项:

import re

text = "My email is user@example.com"
replaced_text = re.sub(r'\S+@\S+', 'hidden@example.com', text)
print(f"替换后的文本:{replaced_text}")
4. 分割字符串

你可以使用 re.split() 来按照正则表达式的匹配项分割字符串:

import re

text = "apple,orange;banana|grape"
fruits = re.split(r'[;|,]', text)
print(f"分割后的水果:{fruits}")
5. 匹配多个条件

你可以组合多个条件来进行复杂的匹配。比如,匹配一个有效的日期(YYYY-MM-DD):

import re

date_pattern = r'^\d{4}-\d{2}-\d{2}$'
dates = ["2024-12-31", "12-31-2024", "2024-2-30"]
valid_dates = [date for date in dates if re.match(date_pattern, date)]
print(f"有效的日期:{valid_dates}")

具体使用时,还需要根据正则的基础语法进行拼接和使用,欢迎大家留言讨论。


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

相关文章:

  • 【Vue】vue项目中命名规范(结合上一篇项目结构)
  • aardio —— 虚表 —— 模拟属性框
  • 如何使用Python自动化发送消息:用pynput库批量输入并发送文本
  • liunx下载gitlab
  • 【国产NI替代】基于STM32+FPGA的8振动+4温度(16bits)数据采集板卡解决方案,支持全国产
  • AWS S3文件存储工具类
  • 大中厂面试经验分享:如何使用消息队列(MQ)解决系统问题
  • 科技风杂志科技风杂志社科技风编辑部2024年第36期目录
  • 【优选算法】有效三角形的个数
  • SpringBoot集成ECDH密钥交换
  • Linux C/C++编程-网络程序架构与套接字类型
  • 【Java 新特性】深入浅出 Java Lambda 表达式
  • vim里搜索关键字
  • 【Windows】Windows系统查看目录中子目录占用空间大小
  • YK人工智能(二)——万字长文了解深度学习环境配置
  • grep如何打印行数
  • C++线程池的使用
  • 智能商业分析 Quick BI
  • Spring Security 3.0.2.3版本
  • 为什么需要设置 `NCCL_P2P_DISABLE=1` 和 `NCCL_IB_DISABLE=1`?
  • 4G报警器WT2003H-16S低功耗语音芯片方案开发-实时音频上传
  • 国产低代码框架zdppy开发笔记001 zdppy_api快速入门
  • 《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》学习笔记——HarmonyOS架构介绍
  • 力扣-数据结构-8【算法学习day.79】
  • 石岩路边理发好去处
  • Kerberos用户认证-数据安全-简单了解-230403