【NLP】Python正则表达式

正则表达式(Regular Expression, 简称 Regex)是一种用于匹配字符串中字符模式的强大工具。在Python中,正则表达式由 re 模块支持。正则表达式可以用于搜索、编辑和处理文本。

正则表达式语法

正则表达式由普通字符和特殊字符(元字符)组成。普通字符包括字母、数字和标点符号,匹配其自身。特殊字符用于匹配特定的字符集、位置或重复。

类型模式描述示例
元字符.匹配任意单个字符,除换行符a.b 匹配 aab, a9b
元字符^匹配字符串的开头^abc 匹配 abc
元字符$匹配字符串的结尾abc$ 匹配 abc
元字符*匹配前一个字符零次或多次a* 匹配 a, aaa
元字符+匹配前一个字符一次或多次a+ 匹配 a, aaa
元字符?匹配前一个字符零次或一次a? 匹配 a, 或空
元字符{n}匹配前一个字符恰好 n 次a{3} 匹配 aaa
元字符{n,}匹配前一个字符至少 n 次a{2,} 匹配 aa, aaa
元字符{n,m}匹配前一个字符至少 n 次,至多 m 次a{2,3} 匹配 aa, aaa
元字符[]匹配括号内的任意一个字符[abc] 匹配 a, b, c
元字符|当匹配字符串时,如果左边的模式不匹配,会尝试右边的模式表示“或”操作
元字符\转义字符,用于匹配特殊字符或表示特殊序列\. 匹配 .
特殊序列\d匹配任何数字,相当于 [0-9]\d 匹配 7, 4
特殊序列\D匹配任何非数字字符,相当于 [^0-9]\D 匹配 a, !
特殊序列\w匹配任何字母数字字符和下划线,相当于 [a-zA-Z0-9_]\w 匹配 a, 1, _
特殊序列\W匹配任何非字母数字字符和下划线,相当于 [^a-zA-Z0-9_]\W 匹配 !, @,``
特殊序列\s匹配任何空白字符,相当于 [ \t\n\r\f\v]\s 匹配 ``, \t
特殊序列\S匹配任何非空白字符,相当于 [^ \t\n\r\f\v]\S 匹配 a, 1
特殊序列\b匹配单词边界\bword\b 匹配 word
特殊序列\B匹配非单词边界\Bword\B
分组()用括号将表达式括起来作为一个分组(abc)+ 匹配 abcabc
非捕获分组(?:…)用括号将表达式括起来作为一个非捕获分组(?:abc)+
前向查找(?=…)匹配前面是某个模式的文本(不包含该模式)\d+(?= apples)
后向查找(?<=…)匹配后面是某个模式的文本(不包含该模式)(?<=123 )\w+
非前向查找(?!..)匹配前面不是某个模式的文本\d+(?! apples)
非后向查找(?<!..)匹配后面不是某个模式的文本(?<!123 )\w+

re模块基础

导入 re 模块

import re

基本匹配函数

  • re.match(): 从字符串的开头匹配正则表达式模式。
pattern = r'\d+'
string = '123abc456'
match = re.match(pattern, string)
if match:print('Match:', match.group())  # 输出: '123'
  • re.search(): 搜索字符串,返回第一个匹配的正则表达式模式。
search = re.search(pattern, string)
if search:print('Search:', search.group())  # 输出: '123'
  • re.findall(): 返回字符串中所有匹配正则表达式模式的列表。
findall = re.findall(pattern, string)
print('Findall:', findall)  # 输出: ['123', '456']
  • re.finditer(): 返回一个迭代器,包含字符串中所有匹配正则表达式模式的Match对象。
for match in re.finditer(pattern, string):print('Finditer:', match.group())  # 输出: '123' 和 '456'
  • re.sub(): 替换字符串中所有匹配正则表达式模式的子串。
sub = re.sub(pattern, '#', string)
print('Sub:', sub)  # 输出: '#abc#'

re模块进阶

分组用括号 () 将表达式的一部分括起来。可以用 group(n) 获取匹配的子串。

pattern = r'(\d+)\s+(\w+)'
string = '123 apples'
match = re.search(pattern, string)
if match:print('Group 1:', match.group(1))  # 输出: '123'print('Group 2:', match.group(2))  # 输出: 'apples'

(?:...) 进行非捕获分组,不保存匹配的子串。

pattern = r'(?:\d+)\s+(\w+)'
match = re.search(pattern, string)
if match:print('Group 1:', match.group(1))  # 输出: 'apples'

前后查找

  • 前向查找(Lookahead): 匹配前面是某个模式的文本(不包含该模式)。
pattern = r'\d+(?=\s+apples)'
match = re.search(pattern, string)
if match:print('Lookahead:', match.group())  # 输出: '123'
  • 后向查找(Lookbehind): 匹配后面是某个模式的文本(不包含该模式)。
pattern = r'(?<=123\s)\w+'
match = re.search(pattern, string)
if match:print('Lookbehind:', match.group())  # 输出: 'apples'

re模块高级

使用 re.sub() 函数可以进行更复杂的替换操作,替换字符串可以使用函数。

def replace_func(match):return match.group(1).upper()
pattern = r'(\w+)\s+(\d+)'
string = 'apple 123'
sub = re.sub(pattern, replace_func, string)
print('Sub:', sub)  # 输出: 'APPLE 123'

re.IGNORECASEre.I: 忽略大小写匹配。

re.MULTILINEre.M: 多行模式,^$ 匹配每一行的开头和结尾。

re.DOTALLre.S: 使 . 匹配包括换行在内的所有字符。

re.VERBOSEre.X: 忽略模式中的空白字符和注释,方便书写复杂正则表达式。

pattern = r'(?i)apple'  # 使用 IGNORECASE
string = 'Apple 123'
match = re.search(pattern, string)
if match:print('Ignorecase:', match.group())  # 输出: 'Apple'
pattern = r'(?m)^apple'  # 使用 MULTILINE
string = 'apple\n123\napple'
matches = re.findall(pattern, string)
print('Multiline:', matches)  # 输出: ['apple', 'apple']

使用 re.compile() 将正则表达式编译成模式对象,以便多次重用,提高效率。

pattern = re.compile(r'\d+')
string = '123 abc 456'
matches = pattern.findall(string)
print('Compiled Findall:', matches)  # 输出: ['123', '456']

示例

使用正则表达式匹配字符串中的时间:

def getTime(text):pattern = re.compile(r'''(\d{4})[.-/年](\d{1,2})[.-/月](\d{1,2})[日]?''', re.VERBOSE)  # YYYY.MM.DD YYYY-MM-DD YYYY/MM/DD YYYY年MM月DD日match = pattern.search(text)  # 查找第一个匹配的日期if match:year, month, day = map(int, match.groups())date = datetime(year, month, day)  # 创建 datetime 对象return dateelse:return None

使用正则表达式匹配字符串中的功率:

def getPower(text):pattern = re.compile(r'(\d+)\s*(千伏|kv|KV|kV)')power = pattern.search(text)if power:return power.groups()[0]else:return None

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

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

相关文章

71、最长上升子序列II

最长上升子序列II 题目描述 给定一个长度为N的数列&#xff0c;求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数N。 第二行包含N个整数&#xff0c;表示完整序列。 输出格式 输出一个整数&#xff0c;表示最大长度。 数据范围 1 ≤ N ≤ 100000…

初阶c++入门

1.命名空间 namespace 变量的查找范围&#xff08;默认的情况下&#xff09; 当前的局部变量全局变量不会去命名空间去找&#xff08;以一定的格式 命名::变量或者函数&#xff0c;就是直接去命名空间里去查找&#xff09; 命名空间可以嵌套&#xff0c;来解决命名空间命名重复…

electron录制工具-desktopCapturer录屏

需求 录屏状态时&#xff0c;屏幕底部有个计时器&#xff0c;点击计时器停止录屏&#xff0c;跳转录屏结束的视频播放。 效果如下 electron-录屏演示 实现 计时器 创建一个浮窗&#xff0c;根据x、y坐标移动窗口的位置&#xff1b; // 获取屏幕的主显示器信息const { width…

AI服务器相关知识

在当今社会&#xff0c;人工智能的应用场景愈发广泛&#xff0c;如小爱同学、天猫精灵等 AI 服务已深入人们的生活。随着人工智能时代的来临&#xff0c;AI 服务器也开始在社会各行业发挥重要作用。那么&#xff0c;AI 服务器与传统服务器相比&#xff0c;究竟有何独特之处&…

ArcGIS要点和难点以及具体应用和优缺点介绍

ArcGIS是一款强大的地理信息系统(GIS)软件,广泛应用于各种领域,如城市规划、自然资源管理、环境保护、应急响应、地理科学研究和商业分析等。以下是对ArcGIS的详细介绍: 产品概述: ArcGIS提供了一个可伸缩的、全面的GIS平台,满足从桌面到服务器、野外和Web的各种GIS用户…

【docker】 pull access denied for alpine-java, repository does not exist

问题&#xff1a; com.spotify.docker.client.exceptions.DockerException: pull access denied for alpine-java, repository does not exist or may require docker login: denied: requested access to the resource is denied org.apache.maven.plugin.MojoExecutionExce…

Vue16-绑定class样式

一、vue绑定class样式 1-1、需求一&#xff1a;字符串写法 vue实现class样式绑定 1-2、需求二 点击div&#xff0c;随机切换样式。 math.random()&#xff1a;随机数的范围[0, 1) 1-3、需求三&#xff1a;数组写法 样式的追加 1-4、需求四 &#xff1a;对象写法 二、vue绑定…

mqtt js同时监听多个topic

在mqttjs中&#xff0c;可以使用client.subscribe()方法订阅多个topic&#xff0c;然后使用client.on(message)监听所有订阅的topic的消息。以下是一个示例&#xff1a; javascript const mqtt require(mqtt); const client mqtt.connect(mqtt://test.mosquitto.org); clie…

椋鸟C++笔记#5:C++内存管理

文章目录 C语言中的动态内存管理C\\中的动态内存管理使用new/delete操作内置类型使用new/delete操作自定义类型operator new(operator new[])与operator delete(operator delete[])函数operator new函数operator delete函数operator new[]和operator delete[] new与delete的实现…

ref和out

学习ref和out的原因 它们可以解决在函数内部改变外部传入的内容&#xff0c;里面变了&#xff0c;外面也要改变。 static void ChangeValue(int value) {value 3; }static void ChangeArrayValue(int[] arr) {arr[0] 99; }static void ChangeArray(int[] arr) {//重新声明了…

linux centos consul1.15.2一键安装部署

consul原理、作用、安装相关内容 一、理论部分二、安装下载版本地址三、安装consul服务 一、理论部分 1、consul的原理 Consul的原理及作用可以归纳为以下几点&#xff1a; ①、基于Gossip协议的通信&#xff1a;Consul使用了基于Gossip协议的Serf实现来进行通信。 Gossip协议…

【DevOps】服务器硬件基础知识

目录 前言 1、处理器&#xff08;CPU&#xff09;&#xff1a;服务器的“大脑” 2、内存&#xff08;RAM&#xff09;&#xff1a;服务器的“工作台” 3、存储&#xff08;Storage&#xff09;&#xff1a;服务器的“仓库” 4、 网络接口&#xff08;NIC&#xff09;&…

【教学类-64-03】20240611色块眼力挑战(三)-2-10宫格色差10-50(10倍)适合中班幼儿园(星火讯飞)

背景需求&#xff1a; 【教学类-64-02】20240610色块眼力挑战&#xff08;二&#xff09;-2-25宫格&色差10-100&#xff08;10倍&#xff09;&#xff08;星火讯飞&#xff09;-CSDN博客文章浏览阅读360次&#xff0c;点赞17次&#xff0c;收藏13次。【教学类-64-02】2024…

Warning: `ReactDOMTestUtils.act` is deprecated in favor of `React.act`.

问题&#xff1a;在代码中使用jest进行单元测试时&#xff0c;报错如下&#xff1a; 解决思路&#xff1a; 根据报错提示出来的 react-dom/test-utils 进行全局搜索&#xff0c;发现没有该引用&#xff0c;故进入该代码块中分析。发现代码中引入testing-library/react &#…

算法设计与分析(5题Python版)

1、阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有N堆金币&#xff0c;第i堆金币的总重量和总价值分别是m,v。阿里巴巴有一个承重量为T的背包&#xff0c;但并不一定有办法将全部的金币都装进去。 他想装走尽可能多价值的金币&#xff0c;所有金币都可以随意分割&#xff0c;分…

【云岚到家】-day02-2-客户管理-认证授权

【云岚到家】-day02-2-客户管理-认证授权 第二章 客户管理1 认证模块1.1 需求分析1.2 小程序认证1.2.1 测试小程序认证1.2.1.1 参考官方流程1.2.1.2 申请小程序账号1.2.1.3 创建jzo2o-customer1.2.1.4 部署前端1.2.1.5 编译运行1.2.1.6 真机调试 2 阅读代码2.1 小程序认证流程2…

Qt——升级系列(Level Five):显示类控件、输入类控件、多元素控件、容器类控件、布局管理器

显示类控件 Label QLabel 可以⽤来显⽰⽂本和图⽚. 核⼼属性如下&#xff1a; 属性 说明 text QLabel 中的⽂本 textFormat ⽂本的格式. • Qt::PlainText 纯⽂本 • Qt::RichText 富⽂本(⽀持 html 标签) • Qt::MarkdownText markdown 格式 • Qt::AutoText 根…

Nginx配置详细解释:(4)高级配置

目录 1.网页的状态页 2.Nginx第三方模块(echo) 3.变量 4.自定义访问日志 5.Nginx压缩功能 6.https功能 7.自定义图标 Nginx除了一些基本配置外&#xff0c;还有一些高级配置&#xff0c;如网页的状态&#xff0c;第三方模块需要另外安装&#xff0c;支持变量&#xff0c…

【C语言初阶】循环语句

&#x1f31f;博主主页&#xff1a;我是一只海绵派大星 &#x1f4da;专栏分类&#xff1a;C语言 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、什么是循环语句 二、while语句 while语句中的break和continue break continue 三、for循环 break和continue在for循…

MAC安装idea教程

https://blog.csdn.net/qq_41810415/article/details/131649541 JDK安装 https://blog.csdn.net/dddebug/article/details/121713633 2、编辑.bash_profile文件 vim .bash_profile 进入编辑模式后 按 i 开始添加内容 结束编辑模式按 ESC 结束后保存输入 :wq! 不保存输入 :q! 检…