正则表达式总结-2

news/2024/12/4 22:21:18/文章来源:https://www.cnblogs.com/pam-sh/p/18587362

转载:10个Python正则表达式文本搜索和替换技巧

正则表达式(Regex)是处理文本的强大工具,尤其在Python中,通过re模块,我们可以灵活地进行搜索、匹配、替换等操作。下面,我们将深入浅出地介绍20个实用的Python正则表达式技巧,适合初学者逐步掌握,直到能够自信地运用到实际项目中。

基本匹配与搜索

技巧1:简单字符匹配

import retext = "Hello, World!"
match = re.search(r"World", text)
if match:print("Found:", match.group()) # Output: Found: World
  • 解释 : 使用r前缀表示原始字符串,避免转义问题。这里查找"World"并打印。

特殊字符与范围

技巧2:匹配数字

import retext = "123 is a 6number"
match = re.findall(r"\d+", text)
print(match)  # ['123', '6']
  • \d : 匹配数字。

技巧3:匹配字母

import retext = "123 is a 6 number"
match = re.findall(r"\w+", text)
print(match)  # ['123', 'is', 'a', '6', 'number']
  • \w : 匹配字母或数字
  • +表示前面的字符(\w)至少出现一次。

位置匹配

技巧4:匹配行首

import retext = "Start here\nNext line"
match = re.match(r"^Start", text, re.MULTILINE)
if match:print("Line starts with 'Start'")   # Line starts with 'Start'
  • ^: 行首匹配,配合re.MULTILINE可以匹配多行的行首。

匹配行尾

import retext = "Start here\nNext end"
match = re.search(r"end$", text, re.MULTILINE)
if match:print("Line ends with 'end'")   # Line ends with 'end'
  • $: 行尾匹配。

重复与选择

技巧6:重复匹配

import retext = "aaabbcaadaaaa"
match = re.findall(r"a{2,3}", text)
print(match)  # ['aaa', 'aa', 'aaa']
  • {m,n}: 匹配前一个字符m到n次。

技巧7:或运算

import retext = "aacatcaadogaaa"
match = re.findall(r"cat|dog", text)
print(match)  # ['cat', 'dog']
  • |: 匹配左边或右边的表达式。

分组与 捕获

技巧8:分组匹配

import retext = "John Doe, john@example.com"
email = re.search(r"(\w+)@(\w+\.\w+)", text)
print(email.groups())  # ('john', 'example.com')
  • 使用括号()定义分组。

技巧9:反向引用

import retext = "John Doe, john@example.com"
email = re.search(r"(\w+)@(\w+\.\w+)", text)
# group 方法用于获取匹配对象中的特定部分。group(0) 返回整个匹配的字符串,而 group(1) 返回第一个括号捕获组中的内容,group(2) 返回第二个括号捕获组中的内容,以此类推。
replacement = email.group(1).upper() + "@same.com"
# re.sub是Python正则表达式模块re中的一个函数,用于替换字符串中的匹配项。
new_text = re.sub(email.re, replacement, text)
print(new_text) # John Doe, JOHN@same.com
  • \数字: 引用前面的分组。

非贪婪匹配

技巧10:非贪婪匹配

import retext = "<tag>Some 111 content</tag>"
match = re.search(r"<tag>.*?</tag>", text, re.DOTALL)
print(match.group())    # <tag>Some 111 content</tag>
  • ?*+后变为非贪婪匹配。

预查与否定预查

技巧11:正向预查

import retext = "startmiddle end"
match = re.findall(r"start(?=middle)", text)
print(match)  # ['start']
  • (?=...): 正向预查,后面必须有...但不包括在匹配结果中。

技巧12:否定预查

import retext = "start middle end"
# 这是一个负向前瞻,表示在"start"后面不能紧跟着"middle"。
match = re.findall(r"start(?!middle)", text)
print(match)  # ['start']
  • 负向前瞻:负向前瞻(?!)用于匹配某个位置后面不能是某个特定模式,但不会消耗字符,即匹配结果中不会包含前瞻中的内容。

替换操作

技巧13:简单替换

import retext = "start world end"
new_text = re.sub(r"world", "universe", text)
print(new_text) # start universe end
  • 使用re.sub进行替换操作。

技巧14:使用函数进行动态替换

import re# replace_func 是一个回调函数,用于处理每个匹配到的单词。
def replace_func(match):return match.group().upper()text = "start world end"
# 正则表达式 \b\w+\b 用于匹配单词,其中 \b 表示单词边界,\w+ 表示一个或多个字母数字字符。
new_text = re.sub(r"\b\w+\b", replace_func, text)
print(new_text) # START WORLD END
  • re.sub的第二个参数可以是一个函数,根据匹配对象动态生成替换内容。

全局匹配和遍历

技巧15:全局匹配

import retext = "start world end"
matches = re.finditer(r"\w+", text)
for match in matches:print(match.group())
# start
# world
# end
  • 使用finditer获取所有匹配的迭代器。

编译正则表达式

技巧16:编译正则表达式

import retext = "start 12 e2d"
pattern = re.compile(r"\d+")
matches = pattern.findall(text)
print(matches)  # ['12', '2']
  • 提高重复使用的正则表达式的效率。

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

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

相关文章

高性能计算-NEON-图像旋转

1. 对512*512 png 四通道图像顺时针旋转90度 思路: 像素分块,对块内转置;再水平镜像。图像库使用 stb img 2. 代码 #include <stdio.h> #include <arm_neon.h>#include <stdlib.h> #define STB_IMAGE_IMPLEMENTATION #include "./stb/stb_image.h&quo…

使用自定义 MSBuild Task 阻止 git 的大文件提交

一个自定义 MSBuild Task 的实际案例NuGet Gallery | Jgrass.MSBuild.GitTask 前言 在 .NET 项目自定义 MSBuild Task 中提到,可以使用自定义 MSBuild Task 来实现自定义功能。 这里介绍实现的 git 提交大文件提交拦截功能。 引入 nuget 包之后,设置好要拦截的大小,内置的 L…

ElasticSearch学习笔记

ES7.x和ES8.x的学习笔记1.ElasticSearch概述 1.1 ElasticSearch是什么 Elaticsearch,简称为 ES,ES 是一个开源的高扩展的分布式全文搜索引擎,是整个Elastic Stack 技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上 百台服务器,处理PB级别的数…

不死的魔女与灾厄的少年

传闻......森林的深处里住着一位不死的魔女森林的深处,住着一位魔女。 她已经活了几十个世纪,每代王国的历史书籍中都有她的出现。 人们称她为: “不死的魔女” 寂静了百年的森林,在某一天,闯入了一个不速之客,他倒在了魔女的屋子前。 那是一个浑身染血的少年,不着片缕,…

地址冲突检测(DAD)

地址冲突检测(DAD) 目录地址冲突检测(DAD)一、前言二、免费ARP报文实验拓扑报文分析 一、前言 公网: public,互联网可以访问 ,地址必须唯一 私网:RFC1918隔离公网,安全复用 优点:地址段重叠使用 缺点:地址冲突 IPV6唯一本地地址 = IPV6私网地址,提供global id二、免…

2025年昆明理工大学MBA研究生招生人数

--昆工MBA考研、管理与经济学院、125100工商管理、125602项目管理、199管理类综合能力、F009 政治、F008政治+项目管理概论

ybt2.5章AC自动机题解

算法理解 即在字典树上跑kmp T1: 根据这个结论我自己手搓了一个AC自动机上去,喜提TLE 我是如何操作的呢? 我当时的想法是这样的:我们把字典树从根到该节点形成的链看成是一个模式串与文本串进行匹配,然后就用一个dfs来传递j就可以解决了 然后我打开书一看到这幅图,立马就不…

了解checksec显示的各种参数和保护

Arch:内核(32位/64位) RELRO 在Linux系统安全领域数据可以写的存储区就会是攻击的目标,尤其是存储函数指针的区域。所以在安全防护的角度来说尽量减少可写的存储区域对安全会有极大的好处. GCC, GNU linker以及Glibc-dynamic linker一起配合实现了一种叫做relro的技术: rea…

20222325 2024-2025-1 《网络与系统攻防技术》实验八实验报告

1.实验内容 (1)Web前端HTML 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML (2)Web前端javascipt 理解JavaScript的基本功能,理解DOM 在(1)的基础上,编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入…

【C++】关于 Visual Studio 的使用技巧(保姆级教程)

目录fliter 视图输出文件位置设置查看预处理结果将目标文件转换为可读的汇编自定义程序入口调试时查看变量在内存中的具体值查看代码的反汇编 fliter 视图 visual studio默认是filter视图(中文为筛选器)项目下的是filter而非硬盘目录里实际的文件夹,这时新建的也是filter想要…

Linux: Centos7 Cannot find a valid baseurl for repo: base/7/x86_64 解决方案

问题背景 执行yum update出现如下报错排查虚拟机是否联网 ping -c 4 www.baidu.com 可以看到网络链接没有问题解决方案 原因是国外的镜像源有问题,换成国内的即可。 备份原有的镜像源 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下…