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

作者:Seth Larson

译者:豌豆花下猫@Python猫

英文:[Regex character "" doesn't mean "end-of-string"](https://sethmlarson.dev/regex--matches-end-of-string-or-newline)

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

这篇文章写一写我最近在用 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

相关推荐
AIFQuant33 分钟前
2026 全球股票/外汇/贵金属行情 API 深度对比:延迟、覆盖、价格与稳定性
python·websocket·ai·金融·mcp
Ray Liang1 小时前
吐血整理JSON-RPC2.0的原理与应用
python
㳺三才人子1 小时前
簡單的 語音助手
python·ai编程·pip
计算机毕业编程指导师1 小时前
【计算机毕设推荐】Python+Hadoop+Spark共享单车数据可视化分析系统 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘
大数据·hadoop·python·计算机·数据挖掘·spark·课程设计
2301_795099741 小时前
golang如何在Gin中自定义验证器_golang Gin自定义验证器实现方法
jvm·数据库·python
计算机毕业编程指导师1 小时前
【计算机毕设】基于Hadoop的共享单车订单数据分析系统+Python+Django全栈开发 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘
大数据·hadoop·python·计算机·数据挖掘·spark·django
2301_766283442 小时前
如何在MongoDB GridFS中进行按文件大小(length)范围的查询
jvm·数据库·python
他是龙5512 小时前
71:Python安全 & 反序列化 & PYC反编译 & 格式化字符串安全
开发语言·python·安全
2601_956139422 小时前
文体娱媒品牌全案公司哪家强
大数据·人工智能·python
水木流年追梦2 小时前
【python因果库实战27】逆概率加权模型2
开发语言·python