码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 正则表达式中 “$” 并不是表示 “字符串结束


    作者: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

  • 相关阅读:
    家谱文化研究②:比赘婿更不光彩的家庭角色?何雨柱还乐在其中
    DW大学生网页作业制作设计 中华饮食文化(HTML+CSS+JavaScript) Web前端大作业
    【服务器】shell脚本之Docker创建nginx
    在ubuntu上用QT写一个简单的C++小游戏(附源码)
    pandas分组与聚合groupby()函数详解
    INnoDB(索引与算法)
    python解析命令行参数为dict
    嵌套合并如何操作,合并视频的同时设置新视频标题
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校教学过程管理系统34085
    《搞定音频技术》
  • 原文地址:https://www.cnblogs.com/pythonista/p/18136957
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号