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

Python 正则表达式(re)

目录

一、概述

二、基本概念

模式字符串

原始字符串

编译正则表达式

三、正则表达式的基本模式匹配

字符匹配

锚点

量词

四、常用函数

re.match()

re.search()

re.findall()

re.finditer()

re.sub()

五、高级主题

分组和捕获

非贪婪匹配

前瞻和后顾(零宽断言)

六、编译正则表达式

七、错误处理


一、概述

正则表达式是一种强大的字符串匹配工具,通过定义搜索模式,可以在文本中搜索、替换符合条件的字符串。在 Python 中,正则表达式模块由 re 提供支持。本文将详细介绍正则表达式的语法、常用函数和高级用法。

二、基本概念

模式字符串

正则表达式由模式字符串定义,它包含了正则表达式的语法和符号。

原始字符串

建议使用原始字符串(前面带有r的字符串)来表示模式字符串,这样可以避免转义字符带来的混淆。

pattern = r'\bfoo\b'
编译正则表达式

虽然可以直接使用正则表达式,但编译正则表达式可以提高效率,尤其是在多次使用同一表达式时。

compiled_pattern = re.compile(r'\bfoo\b')

三、正则表达式的基本模式匹配

字符匹配
  • .:匹配除换行符以外的任何单个字符
  • [...]:匹配字符集合中的一个字符
  • [^...]:匹配不在字符集合中的一个字符
  • \d:匹配任何数字,等价于[0-9]
  • \D:匹配任何非数字字符,等价于[^0-9]
  • \s:匹配任何空白字符,包括空格、制表符、换页符等,等价于[ \t\n\r\f\v]
  • \S:匹配任何非空白字符,等价于[^ \t\n\r\f\v]
  • \w:匹配任何字母数字字符,等价于[a-zA-Z0-9_]
  • \W:匹配任何非字母数字字符,等价于[^a-zA-Z0-9_]
锚点
  • ^:匹配字符串的开头
  • $:匹配字符串的结尾
  • \A:匹配字符串的开始(不受多行模式的影响)
  • \Z:匹配字符串的结束(不受多行模式的影响)
  • \b:匹配一个单词边界
  • \B:匹配非单词边界
量词
  • *:匹配前面的子表达式零次或多次
  • +:匹配前面的子表达式一次或多次
  • ?:匹配前面的子表达式零次或一次
  • {n}:匹配前面的子表达式恰好n次
  • {n,}:匹配前面的子表达式至少n次
  • {n,m}:匹配前面的子表达式至少n次,但不超过m次

四、常用函数

re.match()

re.match()函数从字符串的开始处匹配正则表达式。如果匹配成功,返回一个匹配对象;否则返回None

match = re.match(r'\d+', '123abc')
if match:print('Found:', match.group(0))
re.search()

re.search()函数在整个字符串中搜索匹配的正则表达式,返回第一个匹配对象。

search = re.search(r'\d+', 'abc123def')
if search:print('Found:', search.group(0))
re.findall()

re.findall()函数返回字符串中所有匹配正则表达式的部分的列表。

findall = re.findall(r'\d+', '123abc456def')
print('All matches:', findall)
re.finditer()

re.finditer()函数返回一个迭代器,其中包含字符串中所有匹配正则表达式的部分。

for match in re.finditer(r'\d+', '123abc456def'):print('Found:', match.group(0))
re.sub()

re.sub()函数用于替换字符串中匹配正则表达式的部分。

replaced = re.sub(r'\d+', 'number', '123abc456def')
print('Replaced:', replaced)

五、高级主题

分组和捕获

使用圆括号进行分组,可以在后面引用这些分组。

grouped = re.search(r'(\d+).+(\d+)', '123abc456def')
if grouped:print('First group:', grouped.group(1))print('Second group:', grouped.group(2))
非贪婪匹配

在Python的re模块中,正则表达式默认是贪婪匹配。这意味着在进行匹配时,正则表达式会尽可能地匹配更多的字符。

在量词(*, +, ?, {n,m})后面加上?,可以进行非贪婪匹配,即尽可能少地匹配字符。

nongreedy = re.search(r'\d+?', '123abc')
if nongreedy:print('Non-greedy match:', nongreedy.group(0))
前瞻和后顾(零宽断言)

使用前瞻和后顾可以在不包含在匹配中的情况下,断言此位置前后是否能匹配模式。

  • 正前瞻 (?=...):匹配...前面的位置。
  • 负前瞻 (?!...):匹配不在...前面的位置。
  • 正后顾 (?<=...):匹配...后面的位置。
  • 负后顾 (?<!...):匹配不在...后面的位置。
lookahead = re.search(r'\d(?=\D)', '123abc')
if lookahead:print('Lookahead match:', lookahead.group(0))

六、编译正则表达式

re.compile()

re.compile() 函数是 re 模块中的一个重要函数,它用于将正则表达式的字符串形式编译成一个 Pattern 对象。预编译可以让你在后续的查找或匹配中重复使用该正则表达式,而无需每次使用时都重新编译,这样可以提高效率。

import re# 将正则表达式编译成Pattern对象
pattern = re.compile(r'\d+')  # 匹配一个或多个数字# 使用Pattern对象进行匹配
match_result = pattern.match('123abc')
if match_result:print(match_result.group())  # 输出:123search_result = pattern.search('abc123def')
if search_result:print(search_result.group())  # 输出:123# 使用Pattern对象查找所有匹配项
findall_result = pattern.findall('123abc456def')
print(findall_result)  # 输出:['123', '456']# 使用Pattern对象进行迭代查找
for match in pattern.finditer('123abc456def'):print(match.group())  # 输出:123 然后 456# 使用Pattern对象替换字符串中的模式
sub_result = pattern.sub("#", '123abc456def')
print(sub_result)  # 输出:#abc#def

re.compile() 函数接受一个额外的标志参数 flags,这些标志可以改变正则表达式的工作方式。例如:

  • re.IGNORECASE 或 re.I:忽略大小写。
  • re.MULTILINE 或 re.M:多行模式,改变 ^ 和 $ 的行为。
  • re.DOTALL 或 re.S:使 . 匹配任何字符,包括换行符。

例如,如果我们想让正则表达式忽略大小写,可以这样编译它:

pattern = re.compile(r'[a-z]+', re.I)

这个编译后的 Pattern 对象可以用来匹配任意字母序列,不论大小写。

七、错误处理

使用re模块时,可能会遇到re.error异常,通常是因为正则表达式的语法错误。

try:re.search(r'(\d', '123abc')  # 缺少闭合的圆括号
except re.error as e:print('Regex error:', e)

这个简介涵盖了Python中re模块的基本使用和主要功能。要精通正则表达式,需要大量的练习和对复杂文本模式的理解。正则表达式是一个强大的工具,但也需要谨慎使用,因为复杂的表达式可能难以维护和理解。

相关文章:

  • 东方 - 循环(2) - 求和计数
  • PDF编辑和格式转换工具 Cisdem PDFMaster for Mac
  • Adaboost集成学习 | Matlab实现基于ELM-Adaboost极限学习机结合Adaboost集成学习时间序列预测(股票价格预测)
  • 前端三剑客 —— CSS (第三节)
  • JavaScript条件判断
  • 去班味的尽头是风险管理
  • vue2源码解析——vue中如何进行依赖收集、响应式原理
  • 一文解决IDea中Springboot 热部署:IDEA中Spring Boot应用热部署的几种方式及操作步骤
  • linux------jekins构建cicd
  • 【前端开发】教程及案例.docx
  • 重读Java设计模式: 深入探讨建造者模式,构建复杂对象的优雅解决方案
  • wps没保存关闭了恢复数据教程
  • 备战蓝桥杯---DP刷题2
  • Web框架开发-Django-model进阶
  • python+scrapy电影推荐系统可视化分析系统
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 78. Subsets
  • CentOS 7 修改主机名
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • express如何解决request entity too large问题
  • Js基础知识(一) - 变量
  • npx命令介绍
  • 从零开始的无人驾驶 1
  • 关于springcloud Gateway中的限流
  • 解决iview多表头动态更改列元素发生的错误
  • 聚簇索引和非聚簇索引
  • 设计模式 开闭原则
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 推荐一个React的管理后台框架
  • 正则与JS中的正则
  • 终端用户监控:真实用户监控还是模拟监控?
  • linux 淘宝开源监控工具tsar
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​​​​​​​​​​​​​​Γ函数
  • ​如何防止网络攻击?
  • (09)Hive——CTE 公共表达式
  • (10)ATF MMU转换表
  • (2)STM32单片机上位机
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (day6) 319. 灯泡开关
  • (LeetCode) T14. Longest Common Prefix
  • (三)模仿学习-Action数据的模仿
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • ;号自动换行
  • @GlobalLock注解作用与原理解析
  • @基于大模型的旅游路线推荐方案
  • [ SNOI 2013 ] Quare
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题