首页 > 其他分享 >正则表达式中 “$” 并不是表示 “字符串结束

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

时间:2024-04-15 21:46:12浏览次数:24  
标签:结束 正则表达式 cat 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 开发者量身打造的资讯平台,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。

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

标签:结束,正则表达式,cat,Python,字符串,匹配,换行符,末尾
From: https://www.cnblogs.com/pythonista/p/18136957

相关文章

  • 2466. 统计构造好字符串的方案数
    题目链接:本题其实是爬楼梯这道题的变式。题目要求长度在\(\rmlow\simhigh\)之间的好字符串个数,那我直接把所有长度的好字符串个数搞出来,再取长度在这个区间的相加就完事了。设\(f[i]\)表示构造长为\(i\)的字符串的方案数,也即长为\(i\)的好字符串的个数。看最后一步......
  • IFreeSql各数据库连接字符串格式
    IFreeSql各数据库连接字符串格式 DataTypeConnectionStringDataType.MySqlDataSource=127.0.0.1;Port=3306;UserID=root;Password=root;InitialCatalog=cccddd;Charset=utf8;SslMode=none;Minpoolsize=1DataType.PostgreSQLHost=192.168.164.10;Port=5432;Us......
  • 正则表达式在字符串中表达
    ysyx的表达式求值环节需要自行编写规则。在样例里,官方已经给出了匹配空格、加号的样例。空格规则对应字符串为"+",表示匹配一个或更多空格。加号表示前面的符号至少出现一次。加号规则则是"\\+" ,首先,加号+在正则表达式里是特殊符号,需要一个反斜杠\转义才能执行,但是反斜杠......
  • 正则表达式常用学习
    0.简介regularexpression,规则表达式,是一种用来处理字符串的规则,巧妙的正则表达式可以节省很多判断代码.1.组成元字符特殊元字符\转义字符=>普通字符<=>特殊字符.点=>代表除了\n以外的任意字符(字符字符字符)^=>以哪个元字符开始$=>......
  • 项目中统一处理请求中的字符串参数的空格
    测试controller@RestController@RequestMapping("/test")@Slf4jpublicclassTestController{@GetMapping("/testStringParamTrim")publicTestObjectInfotestStringParamTrim(@RequestParamStringgoodsId,StringgoodsName){......
  • 代码随想录算法训练营第8天 | 字符串 344.反转字符串 541. 反转字符串II 卡码网:54.
    leetcode344.反转字符串题目344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。解题思路实现代码......
  • 代码随想录算法训练营第9天 | 字符串(KMP算法) 28. 找出字符串中第一个匹配项的下标
    leetcode28.找出字符串中第一个匹配项的下标题目28.找出字符串中第一个匹配项的下标给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回-1。解题思路实现代......
  • js正则表达式
    正则表达式创建正则对象//构造函数newRegExp('规则','标识')//字面量书写/规则/标识正则常用方法//reg是正则对象reg.test('字符串');//验证字符串是否满足规则//reg是正则对象,str是字符串str.replace(reg,'替换目标');//将字符串中匹配正则的部分替换为目......
  • 从Google网页中通过正则表达式获取json如何转换unicode对象
    场景:Google爬虫,获取下拉框搜索关键词,需要获取页面的里面的json字符串如下面:'{\\x22aa\\x22:{},\\x22abd\\x22:{\\x22abd\\x22:false,\\x22deb\\x22:false,\\x22det\\x22:false},\\x22async\\x22:{},\\x22attn\\x22:{},\\x22bgd\\x22:{\\x22ac\\x22:true,\\x......
  • 字符串基础
    字符串的常见函数:strlen()//计算字符串的长度,即字符串中字符的个数(不包括字符串末尾的空字符'\0'strcpy()//将一个字符串复制到另一个字符串中。目标字符串必须有足够的空间来容纳被复制的字符串。strcat()//将一个字符串追加到另一个字符串的末尾。目标字符......