Python猫 2024年07月09日
正则表达式中 “$” 并不是表示 “字符串结束”
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

在使用 Python 正则表达式模块时,$ 符号并非总是代表字符串的结尾。当禁用多行模式时,$ 会匹配字符串末尾的换行符,导致无法匹配没有换行符的字符串。本文介绍了如何在 Python 中使用 \z 和 \Z 来匹配字符串结尾,并比较了不同语言中正则表达式匹配字符串结尾的差异。

🤔 在 Python 中,$ 符号在禁用多行模式时,不仅匹配字符串的结尾,还会匹配字符串末尾的换行符。这意味着如果要匹配一个没有换行符的字符串,使用 $ 是做不到的。

💡 为了解决这个问题,可以使用 \z 和 \Z 来匹配字符串结尾。\z 匹配字符串的绝对结尾,而 \Z 匹配字符串的结尾或最后一个换行符之前。

🌎 在不同编程语言中,正则表达式匹配字符串结尾的行为存在差异。例如,在 PHP、Java 和 .NET 中,可以使用 \z 来匹配字符串结尾,而在 ECMAScript 中,需要使用非多行模式的 $ 符号。

📊 本文还列出了不同语言中正则表达式匹配字符串结尾的行为对比表格,方便读者了解不同语言的差异。

📚 最后,作者推荐了自己的《Python潮流周刊》专栏,这是一个专为国内 Python 开发者量身打造的资讯平台。

作者: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 开发者量身打造的资讯平台,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Python 正则表达式 字符串匹配
相关文章