正则表达式中 “$” 并不是表示 “字符串结束

作者:Seth Larson

译者:豌豆花下猫@Python猫

英文:Regex character “$” doesn't mean “end-of-string”

转载请保留作者及译者信息!

这篇文章写一写我最近在用 Python 的正则表达式模块(re)开发 CPython 的 SBOM 工具时发现的一个令人惊讶的行为。

如果用过正则表达式,你可能知道 ^ 表示 “字符串开始”,并相应地将 $ 视为 “字符串结束”。因此认为, cat$ 模式会匹配字符串 "lolcat" ,但不会匹配 "internet cat video"

^ 的行为让我认为 $ 也是类似的,但这并不一定成立,而且这种行为取决于不同编程语言及其写法。

特别是对于 Python 来说,如果禁用了多行模式(这是默认设置),那么,$ 字符不仅可以匹配字符串的末尾,还可以匹配字符串末尾的换行符。

所以,如果你试图匹配一个末尾没有换行符的字符串,在 Python 中使用 $ 是做不到的!我本以为禁用多行模式后,就不会有这种匹配换行符的行为,但事实恰恰相反。

下一个合乎逻辑的问题是,如何在 Python 中匹配一个末尾不含换行符的字符串?

在对 Python 和其它正则表达式语法进行多番研究后,我还发现了 \z\Z 可以用于匹配 “字符串结束” 字符。

在 Python 中,可以用 re.MULTILINE 来启用多行模式,文档的描述如下:

当指定 re.MULTILINE 时,模式字符 '$' 会匹配字符串末尾以及每一行末尾(包含换行符)。默认情况下,'$' 只匹配字符串末尾以及字符串末尾的换行符之前(如果有的话)。

让我们看看这些特性在不同平台上是什么表现:

模式匹配 "cat\n"?"cat$" 多行模式"cat$" 无多行模式"cat\z""cat\Z"
PHP
ECMAScript⚠️⚠️
Python⚠️
Golang⚠️
Java 8
.NET 7.0
Rust⚠️
  • ✅: 模式与字符串 "cat\n" 匹配
  • ❌: 模式与字符串 "cat\n" 不匹配
  • ⚠️: 模式无效或不支持该用法

综合上述表格,如果要匹配换行符,那么在所有语言中使用多行模式的 $ ,都能匹配成功;但如果不想匹配换行符,事情就会变得复杂起来。

如果不想匹配换行符,在除了 Python 和 ECMAScript 外的其它语言中,你可以使用 \z。而在 Python 中,你需要使用 \Z ,在 ECMAScript 中使用非多行模式的 $

今天这些关于正则表达式的知识,你学会了么?

注意:上述数据表的信息收集自 regex101.com,我没有用实际的编程环境进行测试。


以上是今天的分享,最后推荐一下我的《Python潮流周刊》专栏。这是一个专为国内 Python 开发者量身打造的资讯平台,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。

https://xiaobot.net/p/python_weekly?refer=2fc438e2-33fe-44bd-aa2f-ae7d8e782dea

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

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

相关文章

c++ 面向对象之 Lambda 表达式

一、简介 Lambda 表达式是 c11 中语法之一(所以不要在 dev c 没添加 -stdc11/-stdc14 时使用了,等待你的是报错)。Lambda 表达式把函数看作对象,把这个表达式当做对象使用。 二、使用 Lambda 表达式难以声明类型,故使…

阿里云迁移到AWS云,九河云保姆级教程

随着云计算技术的不断发展,越来越多的企业开始将传统的IT基础设施迁移到云平台上,以获得更高的灵活性、可扩展性和成本效益。在众多云服务提供商中,阿里云和AWS都是备受青睐的选择。本文将探讨如何将阿里云上的资源顺利迁移到AWS云平台,并针对性地进行优化。我们九河云&#xf…

[图解]DDD领域驱动设计伪创新-聚合根06

0 00:00:00,740 --> 00:00:02,200 那刚才讲了 1 00:00:02,480 --> 00:00:04,211 Evans这个隐喻 2 00:00:04,211 --> 00:00:06,520 实际上背后是把集合 3 00:00:06,800 --> 00:00:08,560 当成了聚合 4 00:00:10,580 --> 00:00:14,350 那为什么有这样的一个隐…

OpenHarmony实战开发-如何使用AKI轻松实现跨语言调用。

介绍 针对JS与C/C跨语言访问场景,NAPI使用比较繁琐。而AKI提供了极简语法糖使用方式,一行代码完成JS与C/C的无障碍跨语言互调,使用方便。本示例将介绍使用AKI编写C跨线程调用JS函数场景。通过调用C全局函数,创建子线程来调用JS函…

阿尔法编程使用

使用登录 平台地址:https://nuc.alphacoding.cn/(建议使用最新的chrome、firefox、safari、edge打开,不要从微信直接打开) 教师体验账号:teacher01-teacher10,一共10个账号,密码是123456&#…

GIS 数据格式转换

1、在线工具 mapshaper 2、数据上传 3、数据格式转换 导入数据可导出为多种格式:Shapefile、Json、GeoJson、CSV、TopJSON、KML、SVG

APP广告变现项目

APP广告变现项目 很多人觉得不可能,这是肯定存在的,不是现在才有的一个项目,这个项目的原理是怎么样呢,就是通过某些特定的app,然后看完广告就有收益,基本单次的观看单价都是在几毛到1块之间。 养机养好的…

java面试题(7)|Java 中的 Set 集合是如何保证添加元素不重复的?

文章目录 HashSetTreeSetLinkedHashSet 在 Java 中,Set 集合通过其实现类来确保不包含重复元素。常见的实现类有 HashSet、TreeSet 和 LinkedHashSet。 HashSet HashSet 使用 HashMap 来存储元素,其中元素作为键,而值则是一个常量。当你尝试…

ES6 import / export / export default type=module

1.export可以导出多个变量,函数,变量,函数需要一个一个导出,也可以以对象的方式导出{}; 2.import的时候,也需要加{},且变量名,函数名需要和导出的一样。 3.export default 只能导出一个对象&…

阿里云服务器带宽多少钱?公网带宽收费标准全解析

阿里云服务器的公网带宽计费模式分为“按固定带宽”和“按使用流量”,有什么区别?按固定带宽是指直接购买多少M带宽,比如1M、5M、10M、100M等,阿里云直接分配用户所购买的带宽值,根据带宽大小先付费再使用;…

ADC通道检测功能-单片机通用模板

ADC通道检测功能-单片机通用模板 使用ADC外设的流程: 先初始化ADC外设的时钟;选择ADC的参考电压以及需要采集的通道;ADSOC1 开始转换,死循环等待转换完成ADSOC0;从ADCDH、ADCDL数据寄存器取出ADC转换数值;…

一套3种风格经典的wordpress免费主题模板

wordpress免费企业主题 https://www.wpniu.com/themes/39.html 免费wordpress企业模板 https://www.wpniu.com/themes/43.html 免费wordpress企业主题 https://www.wpniu.com/themes/44.html

波奇学Linux:ip协议

ip报头是c语言的结构体 报头和有效载荷如何分离? 固定长度四位首部长度 4位版本号就是IPV4 8位服务类型:4位TOS位段和位保留字段 4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本 给路由器提…

【JAVA基础篇教学】第十六篇:Java连接和操作MySQL数据库

博主打算从0-1讲解下java基础教学,今天教学第十六篇:Java连接和操作MySQL数据库。 我将提供一个简单的示例代码,涵盖数据库连接、查询、插入和更新等操作。 一、下载MySQL驱动包 1.下载地址:MySQL :: Download Connector/J 2.解…

Navicat for MySQL 使用基础与 SQL 语言的DDL

一、目的: Navicat for MySQL 是一套专为 MySQL 设计的高性能数据库管理及开发 工具。它可以用于任何版本 3.21 或以上的 MySQL 数据库服务器,并支持大 部份 MySQL 最新版本的功能,包括触发器、存储过程、函数、事件、视图、 管理用户等。…

VMware配置CentOS 7 并实现ssh连接

Vmware 17下载地址 ***永久许可证:***5Y012-8HL8P-0J8U0-032Q6-93KKF CentOS 7 下载地址 一、配置CentOS 如下 创建新的虚拟机,选择典型,点击下一步 选择上述下载镜像存储位置,选择镜像,点击下一步 3.填写相关信息…

动态规划专练( 279.完全平方数)

279.完全平方数 给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 …

微信小程序wx.getLocation 真机调试不出现隐私弹窗

在小程序的开发过程中,首页中包含要获取用户地理位置的功能,所以在这里的onLoad()中调用了wx.getLocation(),模拟调试时一切正常,但到了真机环境中就隐私框就不再弹出,并且出现了报错&#xff0…

智能生活新体验:小米香薰加湿器技术解码

在现代家居生活中,科技与舒适性日益交织,智能家居产品成为提升生活品质的重要工具。小米香薰加湿器作为一款集科技与生活美学于一体的产品,其独特的设计和多功能性受到了广泛欢迎。今天,我们就来详细拆解这款融合了科技与香薰元素…

Sony Camera Remote SDK在Windows上的使用

Sony官方提供了相机遥控软件开发包,允许用户自行开发应用软件,实现对相机的远程控制,包括拍摄、监看和文件传输等。截至目前最新的版本是2024.4.12发布的1.12.00版本,下载链接如下:Camera Remote SDK | LICENSE AGREEM…