作者:Seth Larson
譯者:豌豆花下貓@Python貓
英文:Regex character “$” doesn't mean “end-of-string”
轉(zhuǎn)載請(qǐng)保留作者及譯者信息!
這篇文章寫一寫我最近在用 Python 的正則表達(dá)式模塊(re
)開(kāi)發(fā) CPython 的 SBOM 工具時(shí)發(fā)現(xiàn)的一個(gè)令人驚訝的行為。
如果用過(guò)正則表達(dá)式,你可能知道 ^
表示 “字符串開(kāi)始”,并相應(yīng)地將 $
視為 “字符串結(jié)束”。因此認(rèn)為, cat$
模式會(huì)匹配字符串 "lolcat"
,但不會(huì)匹配 "internet cat video"
。
^
的行為讓我認(rèn)為 $
也是類似的,但這并不一定成立,而且這種行為取決于不同編程語(yǔ)言及其寫法。
特別是對(duì)于 Python 來(lái)說(shuō),如果禁用了多行模式(這是默認(rèn)設(shè)置),那么,$
字符不僅可以匹配字符串的末尾,還可以匹配字符串末尾的換行符。
所以,如果你試圖匹配一個(gè)末尾沒(méi)有換行符的字符串,在 Python 中使用 $
是做不到的!我本以為禁用多行模式后,就不會(huì)有這種匹配換行符的行為,但事實(shí)恰恰相反。
下一個(gè)合乎邏輯的問(wèn)題是,如何在 Python 中匹配一個(gè)末尾不含換行符的字符串?
在對(duì) Python 和其它正則表達(dá)式語(yǔ)法進(jìn)行多番研究后,我還發(fā)現(xiàn)了 \z
和 \Z
可以用于匹配 “字符串結(jié)束” 字符。
在 Python 中,可以用 re.MULTILINE
來(lái)啟用多行模式,文檔的描述如下:
當(dāng)指定
re.MULTILINE
時(shí),模式字符'$'
會(huì)匹配字符串末尾以及每一行末尾(包含換行符)。默認(rèn)情況下,'$' 只匹配字符串末尾以及字符串末尾的換行符之前(如果有的話)。
讓我們看看這些特性在不同平臺(tái)上是什么表現(xiàn):
模式匹配 "cat\n"? | "cat$" 多行模式 | "cat$" 無(wú)多行模式 | "cat\z" | "cat\Z" |
---|---|---|---|---|
PHP | ? | ? | ? | ? |
ECMAScript | ? | ? | ?? | ?? |
Python | ? | ? | ?? | ? |
Golang | ? | ? | ? | ?? |
Java 8 | ? | ? | ? | ? |
.NET 7.0 | ? | ? | ? | ? |
Rust | ? | ? | ? | ?? |
- ?: 模式與字符串
"cat\n"
匹配 - ?: 模式與字符串
"cat\n"
不匹配 - ??: 模式無(wú)效或不支持該用法
綜合上述表格,如果要匹配換行符,那么在所有語(yǔ)言中使用多行模式的 $
,都能匹配成功;但如果不想匹配換行符,事情就會(huì)變得復(fù)雜起來(lái)。
如果不想匹配換行符,在除了 Python 和 ECMAScript 外的其它語(yǔ)言中,你可以使用 \z
。而在 Python 中,你需要使用 \Z
,在 ECMAScript 中使用非多行模式的 $
。
今天這些關(guān)于正則表達(dá)式的知識(shí),你學(xué)會(huì)了么?
注意:上述數(shù)據(jù)表的信息收集自 regex101.com,我沒(méi)有用實(shí)際的編程環(huán)境進(jìn)行測(cè)試。
以上是今天的分享,最后推薦一下我的《Python潮流周刊》專欄。這是一個(gè)專為國(guó)內(nèi) Python 開(kāi)發(fā)者量身打造的資訊平臺(tái),為你挑選最值得分享的文章、教程、開(kāi)源項(xiàng)目、軟件工具、播客和視頻、熱門話題等內(nèi)容。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-852675.html
https://xiaobot.net/p/python_weekly?refer=2fc438e2-33fe-44bd-aa2f-ae7d8e782dea文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-852675.html
到了這里,關(guān)于正則表達(dá)式中 “$” 并不是表示 “字符串結(jié)束的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!