正则表达式的高级方法

正则表达式的高级方法

正则表达式(regex)不仅仅是简单的模式匹配工具,它还提供了一系列高级功能,使得处理复杂文本任务变得更加灵活和强大。以下是一些Python中正则表达式的高级用法:

1. 命名捕获组

命名捕获组允许你为每个捕获的子表达式赋予一个名称,这在处理复杂的匹配时特别有用,因为它可以提高代码的可读性和维护性。

import repattern = r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
match = re.match(pattern, '2023-10-12')if match:print(f"Year: {match.group('year')}, Month: {match.group('month')}, Day: {match.group('day')}")
2. 非捕获组

有时候你可能只想分组某些部分的表达式而不希望它们被单独捕获,这时可以使用非捕获组(?:...)

pattern = r'(?:\d{3}-){2}\d{4}'  # 匹配形如123-456-7890的电话号码
matches = re.findall(pattern, 'My numbers are 123-456-7890 and 987-654-3210.')
print(matches)  # 输出: ['123-456-7890', '987-654-3210']
3. 前瞻断言与后瞻断言

这些是用于指定匹配条件的特殊构造,但不消耗字符。前瞻断言(?=...)确保当前位置之后的字符串符合某个模式;后瞻断言(?<=...)确保当前位置之前的字符串符合某个模式。

# 前瞻断言:查找所有后面跟着'.com'的单词
pattern = r'\b\w+(?=\.com\b)'
text = "example.com is a website."
print(re.findall(pattern, text))  # 输出: ['example']# 后瞻断言:查找所有前面有'@'符号的单词
pattern = r'(?<=@)\w+'
text = "Email me at user@example.com"
print(re.findall(pattern, text))  # 输出: ['example']
4. 惰性量词

默认情况下,量词(如*, +, ?)是贪婪的,这意味着它们会尽可能多地匹配字符。使用惰性量词(通过在量词后加?),可以让它们尽可能少地匹配字符。

html = '<div>First paragraph</div><div>Second paragraph</div>'
pattern = r'<div>(.*?)</div>'  # 使用惰性量词'?'
matches = re.findall(pattern, html)
print(matches)  # 输出: ['First paragraph', 'Second paragraph']
5. 条件表达式

条件表达式(?(id/name)yes-pattern|no-pattern)允许根据是否匹配了某个特定的组来决定接下来的匹配规则。

pattern = r'^(?:(?P<int>\d+)|(?P<float>\d+\.\d+))$'
match = re.match(pattern, '123.45')
if match:if match.group('int'):print("Integer:", match.group('int'))elif match.group('float'):print("Float:", match.group('float'))
6. 内联标志

可以在正则表达式的某些部分内部启用或禁用标志,而不需要在整个表达式中都应用该标志。例如,(?i)表示忽略大小写的匹配,只影响其后的部分。

pattern = r'(?i)hello world'  # 忽略大小写
text = "Hello World"
print(bool(re.search(pattern, text)))  # 输出: True
7. 回溯限制

为了优化性能,避免不必要的回溯,可以使用原子组(?>)...来阻止回溯进入括号内的表达式。

pattern = r'(?>(?:\d{3}-){2}\d{4})'  # 原子组防止回溯
text = "Call me at 123-456-7890 or 987-654-3210."
matches = re.findall(pattern, text)
print(matches)  # 输出: ['123-456-7890', '987-654-3210']
8. 递归模式

对于嵌套结构的数据(如HTML标签、括号等),可以使用递归模式(?R)来匹配任意深度的嵌套。

pattern = r'\((?:[^()]*|(?R))*\)'  # 匹配嵌套括号
text = "(This (is (a test)) string)"
matches = re.findall(pattern, text)
print(matches)  # 输出: ['(is (a test))']

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

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

相关文章

【JavaEE初阶】CSS

&#x1f384;CSS是什么&#xff1f; 层叠样式表 (Cascading Style Sheets). CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结构分离. 用来美化HTML所写的界面&#xff0c;就如同化妆一样 &#x1f340;CSS基础语法规范 选…

【Python】【Conda 】Conda vs venv:Python开发者的虚拟环境选择指南

目录 引言一、概述1.1 Conda 虚拟环境1.2 Python venv 虚拟环境 二、安装与设置2.1 安装 Conda 虚拟环境2.2 安装 Python venv 虚拟环境 三、依赖管理3.1 Conda 依赖管理3.2 Python venv 依赖管理 四、适用场景五、性能与资源占用5.1 Conda 性能与资源占用5.2 Python venv 性能…

【计网】HTTP协议详解

&#x1f30e;应用层协议Http 文章目录&#xff1a; 应用层协议Http 认识HTTP协议       认识URL Http协议请求与响应格式       HTTP Request       HTTP Response       HTTP常见Header       URI资源以及网页跳转原因 HTTP其他属性字段   …

Android上运行OpenCV(Android Studio)

用Android Studio的话&#xff0c;整体来说没什么难的&#xff0c;照着教程来做就好了。 【OpenCV】OpenCV库的安装 - Android与OpenCV系列教程_哔哩哔哩_bilibili 主要就是导入module&#xff0c;然后加入依赖。代码只有几行。 if(OpenCVLoader.initLocal()){Toast.makeText(…

openWebUI+ollamawindows+不用docker+webLite本地安装

openWebUI & ollama & windows & 不用docker & webLite 本地安装 总结一下安装教程 10核CPU16G内存 两个web框架都可以&#xff0c;先说简单的 ollama-webui-lite(https://github.com/ollama-webui/ollama-webui-lite) 轻量级&#xff0c;只使用nodejs 先装…

基于决策树方法的心脏病患者患病因子的可视化分析

1 概述 心脏病作为全球范围内的主要健康问题,其患病因素分析与可视化研究具有重要的公共卫生意义。心脏病的发病机制复杂,涉及遗传、环境、生活方式等多种因素。随着社会的发展和生活方式的变化,心脏病的患病率在全球范围内持续上升,特别是在发展中国家,这一趋势更加明显…

Linux下进程替换exec系列接口

文章目录 Linux下进程替换1. c库exec函数族一、exec函数族简介二、exec函数族函数原型及参数说明三、exec函数族的工作机制四、注意事项五、示例代码 2. 系统调用execve接口一、execve接口与C库exec函数族的关系二、函数原型三、参数说明四、工作原理五、返回值六、注意事项七、…

【一本通】质因数分解

【一本通】质因数分解 C语言实现C 语言实现Java语言实现Python语言实现 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 已知正整数n 是两个不同的质数的乘积&#xff0c;试求出较大的那个质数。 输入 输入只有一行&#xff0c;包含一个正…

xtu oj 1618 素数个数

文章目录 前言代码思路 前言 有点儿难&#xff0c;至少对我来说。去年考试我没写出来。 代码 #include<stdio.h> #include<stdbool.h> #include<stdlib.h>//加 math 那个头文件好像要加这个头文件&#xff0c;我之前编译错误过&#xff0c;血泪教训 #incl…

2024149读书笔记|Hans的阿狸五部曲——成长的路上分离在所难免

2024149读书笔记|Hans的阿狸五部曲——成长的路上分离在所难免 1. 《阿狸和小小云》2. 《阿狸和小玉》3. 《阿狸呓语》4. [202480读书笔记|《阿狸和弯月亮》——生的再普通&#xff0c;也是限量版](https://blog.csdn.net/qq_40985985/article/details/139731131)5. 《阿狸永远…

Atcoder ABC383

C BFS。放入所有的H点&#xff0c;bfs在D步内能访问到的点。 #include <bits/stdc.h> using namespace std;typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef vector<int> vi;int h, w, d; string s[1100]; in…

Xcode模拟器运行报错:The request was denied by service delegate

Xcode模拟器运行报错&#xff1a;The request was denied by service delegate 造成的原因: &#xff08;1&#xff09;新的苹果M系列芯片的Mac电脑 &#xff08;2&#xff09;此电脑首次安装启动Xcode的应用程序 &#xff08;3&#xff09;此电脑未安装Rosetta 2 解决方法: …

SQL项目实战与综合应用——项目设计与需求分析

项目设计与需求分析是软件开发过程中的核心环节&#xff0c;尤其在涉及数据库的应用时&#xff0c;良好的设计将直接影响到项目的可扩展性、性能和维护性。本文将深入探讨数据库设计的最佳实践&#xff0c;结合 C 与 SQL 的实际应用场景&#xff0c;涵盖项目需求收集、数据库设…

Python+OpenCV系列:图像的位运算

文章目录 引言 1. 位运算简介2. OpenCV 中的位运算2.1 按位与运算&#xff1a;cv2.bitwise_and()2.2 按位或运算&#xff1a;cv2.bitwise_or()2.3 按位异或运算&#xff1a;cv2.bitwise_xor()2.4 按位取反运算&#xff1a;cv2.bitwise_not() 3. 位运算在图像处理中的应用3.1 图…

高效的 Python Web 开发与数据库操作:基于 FastAPI 的实战与优化

高效的 Python Web 开发与数据库操作&#xff1a;基于 FastAPI 的实战与优化 目录 &#x1f40d; 1. 数据库连接池的使用与管理&#x1f504; 2. 数据库事务的处理与控制&#x1f4a1; 3. FastAPI 中的 ORM 集成与优化 &#x1f40d; 1. 数据库连接池的使用与管理 数据库连接…

D3实现站点路线图demo分享

分享一下通过D3实现的站点路线分布图&#xff0c;这是一个demo。效果图如下&#xff1a; 源码如下&#xff1a; <template><div class"map-test" ref"d3Chart"><div class"tooltip" id"popup-element"><span>…

CTF-WEB: 配置一个Ubuntu 多版本php服务器

今天复现题windows的php /tmp缓存一直是空的,直接配一个新虚拟机 开始 准备一个全新的虚拟机,可以在这里下载镜像 Verifying - USTC Mirrors 走完常规安装流程继续 设置中文(可选) sudo apt install language-pack-zh-hans language-pack-gnome-zh-hans然后在设置->语…

python爬虫--小白篇【爬虫实践】

一、前言 1.1、王者荣耀皮肤爬虫 根据王者荣耀链接&#xff0c;将王者荣耀的全部英雄的全部皮肤图片爬取保存到本地。经过分析得到任务的三个步骤&#xff1a; 根据首页全部英雄列表连接获取全部英雄的名称hero_name以及对应的hero_id&#xff1b;根据单个英雄的hero_name和h…

算法日记 42 day 图论

今天来看看广度优先搜索&#xff0c;并且写几个题。刷到这里我才想起来&#xff0c;当时第一次面试的时候问的就是这个题&#xff0c;当时大概知道一点思路&#xff0c;但不清楚是图论方面的&#xff0c;更别说写出来了。 广度优先搜索&#xff08;BFS&#xff09; 不同于深度…

【NLP 13、实践 ② 判断文本中是否有特定字符出现】

人活着就是为了救赎自己&#xff1b;为了经历世间的美好&#xff1b;为了在挫折中成长变得更坚强 —— 24.12.10 一、定义模型 1.嵌入层 nn.Embedding&#xff1a;将离散值转化为向量 # embedding层&#xff0c;vocab&#xff1a;词表&#xff0c;要多少个数据&#xff08;向…