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

正则表达式(Regular expresssion)

正则表达式

匹配单次
.           :匹配任意一个字符
[ ]	        :匹配[ ]里举例的任意一个字符
/d		    :匹配数字0-9
/D		    :匹配非数字 
/s			:匹配空白或tab建
/S			:匹配非空白
/w			:匹配非特殊字符,a-z, A-Z, 0-9, 汉字
/W			:匹配特殊字符匹配不定次数
*			:匹配前一个字符出现0次到无数次
+			:匹配前一个字符出现至少一次
?			:匹配前一个字符出现1次或0次
{m}			:匹配前一个字符出现m次
```bash
[0-9]{6}匹配一串字符串的前六个数字。运用场景:假设你爬取到了手机锁屏6位密码数据库中的数据可以用它做筛选
```
{m,n}		:匹配前一个字符出现m次到n次
```bash
[0-9a-z_]{8,20}匹配长度8到20位的数字或小写字母或_,可以运用于设置密码格式
```匹配开头或结尾
^			:匹配字符开头
$			:匹配字符结尾
[^指定字符]	:	与^[ ]完全相反,匹配不是[ ]里举例字符开头
```bash
[^a]匹配不是以字母a开头
^[a]匹配以字母a开头
```

★匹配分组相关

| :匹配左右两边任意一个正则表达式

text = '123756786SSSSixstar'
text2 = 'abc'
result = re.match('^[0-9]\d*\w*|abc', text2)  # 输出:abc
result2 = re.match('^[0-9]\d*\w*|abc', text)  # 输出:123756786SSSSixstar

() :将括号作为一个分组。以下面举例解释

你获取了一个有关邮箱的数据库内容,但是你不知道邮箱的格式是qq.com,163.com,139.com
data = ['123756786@qq.com', 'test@139.com', 'jdfasljsafa@163.com']
for i in range(0, len(data)):result = re.match('([\w]{4,20})@(qq.com|139.com|163.com)', data[i])print(result.group())
# 输出:123756786@qq.com
#      test@139.com
#      jdfasljsafa@163.com

一个括号是一个分组,从左到右是分组1分组2一次类推通过result.group(索引)可以返回不同的值如下

print(result.group(0))
# 输出:123756786@qq.com
#      test@139.com
#      jdfasljsafa@163.comprint(result.group(2))
#  输出:123756786
# 		test
# 		jdfasljsafaprint(result.group(2))
#  输出:qq.com
# 		139.com
# 		163.com

\num:这里的num就是分组的序号

```python
假设我要提取网页标签中源代码,例如html标签是<html></html>格式的
text = '<html>hello world</html>'
result1 = re.match('<\D*>', text)  # 输出:<html>hello world</html>
注:		\D*匹配的内容为html>hello world</html
result2 = re.match(r'<(\w*)>\w*\s\w*</\1>', text)  # 输出:<html>hello world</html>
注:		</\1>中的\1就是匹配的分组1中的\w*也就是html因为结尾也有html所以可以直接引用分组1中的内容
result3 = re.match('<(\w*)>\w*\s\w*</\\1>', text)  # 输出:<html>hello world</html>
注:		因为没有使用result2中的r模式所以要防止\1转义因此为\\1但效果一样
print(result3.group())
```

(?P<别名>):分组起别名
(?P=别名):引用别名name匹配分组字符串

```python
以之前的列子为基础进行修改取别名?P<name1>引用别名?P=name1结果如下不变
text = '<html>hello world</html>'
result1 = re.match('<(?P<name1>\w*)>\w*\s\w*</(?P=name1)>', text)  # 输出:<html>hello world</html>```

函数

1.re.match(pattern, string)
功能:从字符串起始位置匹配正则表达式。
特点:仅检查字符串开头,若开头不匹配则返回 None。
等效于正则表达式以 ^ 开头。

```python
示例:
re.match(r'abc', 'abc123')  # 匹配成功
re.match(r'abc', '123abc')  # 匹配失败
```
  1. re.search(pattern, string)
    功能:在整个字符串中搜索第一个匹配项。
    特点:不限制匹配位置,找到第一个匹配即返回。
    即使字符串中间或结尾有匹配也会成功。
示例:
re.search(r'abc', '123abc456')  # 找到 'abc'
  1. re.findall(pattern, string)
    功能:返回所有非重叠匹配项的列表。
    特点:无分组时,返回所有完整匹配的字符串列表。
    有分组时,返回分组内容的元组列表。
示例:
re.findall(r'\d+', '12 apples, 34 bananas')  # ['12', '34']
re.findall(r'(\d)(\w+)', '1a 2b')  # [('1', 'a'), ('2', 'b')]
  1. re.sub(pattern, repl, string)
    功能:替换所有匹配项为指定内容。
    特点:repl 可以是字符串或函数(动态生成替换内容)。
    支持反向引用(如 \1 或 \g<1>)。
示例:
re.sub(r'\d+', 'NUM', 'a1b2')  # 'aNUMbNUM'
re.sub(r'(\d{4})-(\d{2})', r'\2/\1', '2023-10')  # '10/2023'
  1. re.split(pattern, string)
    功能:按正则表达式分割字符串。
    特点:若正则含分组,分隔符会保留在结果中。
    支持复杂分隔符(如多字符或模式)。
示例:
re.split(r'\d+', 'a1b22c')        # ['a', 'b', 'c']
re.split(r'(\d+)', 'a1b22c')      # ['a', '1', 'b', '22', 'c']

练习

练习题

"""
初级题目
提取所有数字
从字符串 "abc123def456ghi789" 中提取所有连续数字(结果应为 ['123', '456', '789'])。匹配邮箱地址
从文本 "联系我:user@example.com 或 admin@test.org" 中提取所有邮箱地址(结果应为 ['user@example.com', 'admin@test.org'])。验证日期格式
检查字符串 "2023-10-05" 是否符合 YYYY-MM-DD 格式(年范围 1900-2099,月 01-12,日 01-31)。"""
str = "abc123def456ghi789"
result = re.findall(r'\d+', str)
print(result)
str2 = "联系我:user@example.com 或 admin@test.org"
result2 = re.findall(r'\b[\w.]+@[\w.]+\.\w+\b', str2)
print(result2)
str3 = "2023-10-30"
result3 = re.match(r'^(19|20)\d{2}-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[0-1])$', str3)
print(result3.group())
"""
中级题目
提取带区号的电话号码
从 "电话:(021)123-4567 或 022-87654321" 中提取所有电话号码,包括括号和短横线(结果应为 ['(021)123-4567', '022-87654321'])。匹配 HTML 标签内容
从 <div class="title">Hello World</div> 中提取标签内的内容 Hello World(不包含标签本身)。分割混合数据
将字符串 "apple, banana; cherry|orange" 按 , ; | 或空格分割成列表(结果为 ['apple', 'banana', 'cherry', 'orange'])。
"""
str4 = "电话:(021)123-4567 或 022-87654321"
result4 = re.findall(r'\(\d{3}\)\d+-\d+|\d{3}-\d+', str4)
print(result4)
str5 = '<div class="title">Hello World</div>'
result5 = re.sub(r'<[\D]+?>', '', str5)
print(result5)
str6 = "apple, banana; cherry|orange"
result6 = re.split(r'[, ;|]+', str6)
print(result6)
"""
高级题目
排除特定模式
从文本 "error: 404, warn: 302, info: 200 OK" 中提取所有非错误状态码(即排除 error 后的数字,结果为 ['302', '200'])。匹配嵌套 JSON 键值
从简化 JSON 片段 "{\"name\": \"John\", \"age\": 30, \"city\": \"New York\"}" 中提取所有键值对(结果为 ['name', 'John', 'age', '30', 'city', 'New York'])。复杂日期时间提取
从日志 "[2023-10-05 14:30:00] ERROR: System failure" 中提取日期和时间(结果为 ['2023-10-05', '14:30:00'])。
"""
str7 = 'error: 404, warn: 302, info: 200 OK'
result7 = re.findall(r'[0-35][0-9][0-9]', str7)
print(result7)
json_str = "{\"name\": \"John\", \"age\": 30, \"city\": \"New York\"}"
result = re.findall(r'"(\w+)":\s*"([^"]+)"|"(\w+)":\s*(\d+)', json_str)
print(result)
# 合并结果并过滤空值
clean_result = [tuple(filter(None, item)) for item in result]
print(clean_result)
str9 = "[2023-10-05 14:30:00] ERROR: System failure"
result9 = re.findall(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}', str9)
print(result9)
str10 = "https://example.com/search?q=python&page=2&sort=desc"
result11 = re.findall(r'[?&][\w]+=[\w]+', str10)
result12 = re.findall(r'[^?=&]+=[^&]+', str10)
result13 = re.findall(r'([^?=&]+)=([^&]+)', str10)
print(result11)
print(result12)
print(result13)

相关文章:

正则表达式(Regular expresssion)

正则表达式 匹配单次 . &#xff1a;匹配任意一个字符 [ ] &#xff1a;匹配[ ]里举例的任意一个字符 /d &#xff1a;匹配数字0-9 /D &#xff1a;匹配非数字 /s &#xff1a;匹配空白或tab建 /S &#xff1a;匹配非空白 /w &#xff1a;…...

React 中级教程

1. useState 与 setState 深入理解 import React, { useState } from react;const Counter = () => {const [count, setCount] = useState(0);const increment = () => {setCount(count + 1); // setState 会异步更新};return (<div><p>Count: {count}</…...

3dtiles——Cesium ion for Autodesk Revit Add-In插件

一、说明&#xff1a; Cesium已经支持3dtiles的模型格式转换&#xff1b; 可以从Cesium官方Aesset中上传gltf等格式文件转换为3dtiles&#xff1b; 也可以下载插件&#xff08;例如revit-cesium插件&#xff09;转换并自动上传到Cesium官方Aseet中。 Revit转3dtiles插件使用…...

高级 Conda 使用:环境导出、共享与优化

1. 引言 在 Conda 的基础包管理功能中&#xff0c;我们了解了如何安装、更新和卸载包。但对于开发者来说&#xff0c;如何更好地管理环境、导出环境配置、共享环境&#xff0c;以及如何优化 Conda 的使用效率&#xff0c;才是提高工作效率的关键。本篇博客将进一步深入 Conda …...

函数perror 和全局变量errno

#include <stdio.h> #include <errno.h> #include <fcntl.h>int main() {int fd open("nonexistent_file.txt", O_RDONLY);if (fd -1) {perror("Failed to open file");}return 0; }控制台有如下输出 Failed to open file: No such f…...

微信小程序的制作

制作微信小程序的过程大致可以分为几个步骤&#xff1a;从环境搭建、项目创建&#xff0c;到开发、调试和发布。下面我会为你简要介绍每个步骤。 1. 准备工作 在开始开发微信小程序之前&#xff0c;你需要确保你已经完成了以下几个步骤&#xff1a; 注册微信小程序账号&…...

QT 异步编程之多线程

一、概述 1、在进行桌面应用程序开发的时候&#xff0c;假设应用程序在某些情况下需要处理比较复制的逻辑&#xff0c;如果只有一个线程去处理&#xff0c;就会导致窗口卡顿&#xff0c;无法处理用户的相关操作。这种情况下就需要使用多线程&#xff0c;其中一个线程处理窗口事…...

人工智能之数学基础:线性子空间

本文重点 在前面的课程中,我们学习了线性空间,本文我们我们在此基础上学习线性子空间。在应用中,线性子空间的概念被广泛应用于信号处理、机器学习、图像处理等领域。 子空间的性质 子空间是线性空间的一部分,它需要满足下面的性质: 设V是数域F上的线性空间,W是V的一个…...

Proxmox 更新软件包数据库(TASK ERROR: command ‘apt-get update‘ failed: exit code 100)

1、连接自己报错的物理机Shell&#xff0c;编辑文件 vi /etc/apt/sources.list.d/pve-enterprise.list 2、注释文件的第一行在开头加上# 按I进入编辑模式后 开头添加# 然后shift&#xff1a; 输入wq或者wq&#xff01;进行保存 3、注释后执行两个命令apt-get update 和 apt…...

Python--常见库与函数

二、Python常见库与函数 2.1 OS库 常用功能&#xff1a;文件/目录操作、路径管理、环境变量。 import os # 路径操作 abs_path os.path.abspath("data.txt") exists os.path.exists(abs_path) # 目录操作 os.mkdir("logs") # 创建目录&#xff08;需处…...

算法——数学建模的十大常用算法

数学建模的十大常用算法在数学建模竞赛和实际问题解决中起着至关重要的作用。以下是这些算法的具体信息、应用场景以及部分算法的C语言代码示例&#xff08;由于篇幅限制&#xff0c;这里只给出部分算法的简要代码或思路&#xff0c;实际应用中可能需要根据具体问题进行调整和扩…...

JVM——垃圾回收算法

目录 垃圾回收算法 评价标准&#xff1a; 标记-清除算法&#xff1a; 复制算法&#xff1a; 标记-整理算法&#xff1a; 分代GC&#xff1a; arthas查看分代之后的内存情况&#xff1a; 垃圾回收算法 java是如何实现垃圾回收的呢&#xff1f;简单来说&#xff0c;垃圾回…...

游戏APP如何通过精准广告策略实现广告变现收益增长?

不同类型的游戏APP合作AdSet聚合广告平台&#xff0c;量身定制广告变现方案&#xff0c;以提升变现收益的表现。#app广告变现 1、智能选择广告形式 基于用户的行为习惯&#xff0c;推荐优化广告格式&#xff0c;包括插屏广告、激励视频广告和Banner广告等&#xff0c;最大化广…...

服务器安全——日志分析和扫描

如何通过访问日志查询被攻击 扫描攻击 攻击日志 GET /index?sindex/%5Cthink%5CModule/Action/Param/$%7Bphpinfo()%7D HTTP/1.1", host: "主机", referrer: "主机sindex/\think\Module/Action/Param/${phpinfo()}" 攻击日志文件 .error.log sql注…...

vue3读取webrtc-stream 视频流

一.首先下载webrtc-stream&#xff0c;方便自己本地搭建视频流服务 https://download.csdn.net/download/cyw8998/90373521 解压后&#xff0c;启动命令 webrtc-streamer.exe -H 127.0.0.1:8020 二.vue3代码如下 <template><h1>video</h1><video id&…...

周考考题(学习自用)

1.查询student表中name叫张某的信息 select * from student where name张某; 2.写出char和varchar类型的区别 1&#xff09;char存储固定长度的字符串&#xff0c;varchar存储可变长度的字符串&#xff08;在实际长度的字符串上加上一个字节用于存储字符串长度&#xff09;&a…...

ubuntu 22.04 安装vsftpd服务

先决条件&#xff0c;确保你已经配置好了存储库。 安装vsftpd 为了方便实验&#xff0c;我已经切换到了root用户。 rootlocal:~# apt-get install vsftpd修改配置 配置文件在 /etc/vsftpd.conf rootlocal:~# grep -vE ^#|^$ /etc/vsftpd.conf listenNO listen_ipv6YES anonymou…...

K-均值(K-means)聚类算法

K-均值&#xff08;K-means&#xff09;聚类算法是一种常用的无监督学习算法&#xff0c;用于将数据集分成 K 个簇&#xff08;clusters&#xff09;。该算法的基本思想是将数据点分为 K 个簇&#xff0c;使得每个数据点所属的簇内部的数据点之间的相似度最大化&#xff0c;而不…...

STM32F407通过FSMC扩展外部SRAM和NAND FLASH

1 扩展外部SRAM 1.1 地址情况 FSMC控制器的存储区分为4个区(Bank)&#xff0c;每个区256MB。其中&#xff0c;Bank1可以用于连接SRAM、NOR FLASH、PSRAM&#xff0c;还可以连接TFT LCD。Bank1的地址范围是0x60000000&#xff5e;0x6FFFFFFF。Bank1又分为4个子区&#xff0c;每…...

AndroidStudio查看Sqlite和SharedPreference

1.查看Sqlite 使用App Inspection&#xff0c;这是个好东西 打开方式&#xff1a;View → Tool Windows → App Inspection 界面如图&#xff1a; App inspection不但可以看Sqlite还可以抓包network和background task连抓包工具都省了。 非常好使 2.查看sharedPreference 使…...

Elasticsearch:15 年来致力于索引一切,找到重要内容

作者&#xff1a;来自 Elastic Shay Banon 及 Philipp Krenn Elasticsearch 刚刚 15 岁了&#xff01;回顾过去 15 年的索引和搜索&#xff0c;并展望未来 15 年的相关内容。 Elasticsearch 刚刚成立 15 周年。一切始于 2010 年 2 月的一篇公告博客文章&#xff08;带有标志性的…...

信呼OA办公系统sql注入漏洞分析

漏洞描述 信呼OA办公系统uploadAction存在SQL注入漏洞&#xff0c;攻击者可利用该漏洞获取数据库敏感信息。 环境搭建 源码下载地址&#xff1a;https://github.com/rainrocka/xinhu 下载后解压到本地网站根目录下&#xff0c;配置好数据库&#xff0c;然后安装即可 默认密…...

TDengine 客户端连接工具 taos-Cli

简介工具获取运行命令行参数 基础参数高级参数 数据导出/导入 数据导出数据导入 执行 SQL 脚本使用小技巧 TAB 键自动补全设置字符列显示宽度其它 错误代码表 简介 TDengine 命令行工具&#xff08;以下简称 TDengine CLI&#xff09;是用户操作 TDengine 实例并与之交互最简…...

机器学习算法 - 随机森林之决策树初探(1)

随机森林是基于集体智慧的一个机器学习算法&#xff0c;也是目前最好的机器学习算法之一。 随机森林实际是一堆决策树的组合&#xff08;正如其名&#xff0c;树多了就是森林了&#xff09;。在用于分类一个新变量时&#xff0c;相关的检测数据提交给构建好的每个分类树。每个…...

原生Three.js 和 Cesium.js 案例 。 智慧城市 数字孪生常用功能列表

对于大多数的开发者来言&#xff0c;看了很多文档可能遇见不到什么有用的&#xff0c;就算有用从文档上看&#xff0c;把代码复制到自己的本地大多数也是不能用的&#xff0c;非常浪费时间和学习成本&#xff0c; 尤其是three.js &#xff0c; cesium.js 这种难度较高&#xff…...

在 PyCharm 中接入deepseek的API的各种方法

在 PyCharm 中接入 DeepSeek 的 API&#xff0c;通常需要以下步骤&#xff1a; 1. 获取 DeepSeek API 密钥 首先&#xff0c;确保你已经在 DeepSeek 平台上注册并获取了 API 密钥&#xff08;API Key&#xff09;。如果没有&#xff0c;请访问 DeepSeek 的官方网站注册并申请 …...

Haskell语言的软件工程

Haskell语言的软件工程 引言 在软件工程的领域中&#xff0c;选择合适的编程语言是每个开发者都需要面对的重要决策。作为一种功能强大的函数式编程语言&#xff0c;Haskell凭借其独特的特性和优势逐渐在许多软件项目中占据一席之地。本文将深入探讨Haskell语言在软件工程中的…...

【2025新】基于springboot的问卷调查小程序设计与实现

目录 一、整体目录&#xff08;示范&#xff09;&#xff1a; 文档含项目技术介绍、E-R图、数据字典、项目功能介绍与截图等 二、运行截图 三、代码部分&#xff08;示范&#xff09;&#xff1a; 四、数据库表(示范)&#xff1a; 数据库表有注释&#xff0c;可以导出数据…...

数据结构——Makefile、算法、排序(2025.2.13)

目录 一、Makefile 1.功能 2.基本语法和相关操作 &#xff08;1&#xff09;创建Makefile文件 &#xff08;2&#xff09;编译规则 &#xff08;3&#xff09;编译 &#xff08;4&#xff09;变量 ①系统变量 ②自定义变量 二、 算法 1.定义 2.算法的设计 &#xff…...

思科、华为、H3C常用命令对照表

取消/关闭 思科no华为undo华三undo 查看 思科show华为display华三display 退出 思科exit华为quit华三quit 设备命名 思科hostname华为sysname华三sysname 进入全局模式 思科enable、config terminal华为system-view华三system-view 删除文件 思科delete华为delete华…...