正規表示式,其實你只需要一章就能學到手!

2021-08-07 02:28:12 字數 2834 閱讀 3229

正規表示式(regex)是一種簡潔的方式,用於確定字串行應如何在字串中匹配。通常大家都認為它們是「可怕」的,但是,正如你所知道的,任何包含在恐懼中的東西通常都不是這樣。正規表示式的事實是,它們是大約八個符號的集合,告訴計算機如何匹配模式串。簡單來說,他們很容易理解。人們遇到困難的地方是,嘗試使用難以置信的複雜的正規表示式,其中解析器實際上會更好。一旦你明白了這八個符號和正規表示式的限制,你就會看到它們根本不可怕。

我打算讓你記憶更多東西,使你的的大腦為討論做好準備。

^

錨定字串開頭。只有字串剛好位於開頭,它才會匹配。

$

錨定字串末尾。只有字串到達了末尾,它才會匹配。

.

任何單個字元。接受任何單個字元的輸入。

?

正規表示式的之前的部分是可選的,所以a?的意思是可選的字元a

*

之前的部分是零個或多個(任意個)。選取正規表示式的之前的部分,重複接受或者跳過它。a*會接受"aaaaaaa"或者"bqeft",因為它裡面有零個a

+

之前的部分是乙個或多個(至少乙個)。和*類似,但是只接受乙個或多個這種字元。a+會匹配"aaaaaaa",但不是"bqeft"

[x-y]

xy的字元範圍,接受任何範圍中列出的字串。[a-z]表示所有大寫英文本母。許多常見字元範圍擁有快捷方式,你可以使用它來代替。

()

捕獲這個正規表示式的部分,便於稍後使用。許多正規表示式庫將其用於替換、提取或修改文字。捕獲會選取正規表示式的()中的部分,並儲存它便於以後使用。之後許多庫可以讓你引用這些捕獲。如果你使用([a-z]+),它會捕獲乙個或多個大寫英文單詞。

python 的re庫列出了一些更多的符號,但大多都是這八個的一些修飾符,或者不在正規表示式庫中經常發現的額外功能。你將快速記住這八個來起步,重點是粗體的部分(錨定末尾,之前部分可選),以便你可以快速回憶它們並解釋他們的作用。

記住這些符號後,請檢視以下正規表示式並將其翻譯成中文,並使用 pythonre庫來嘗試列出的字串,或你可以想到的任何其他字串。

".*bc?$"

hellobc,hellob,helloa,hellobcx

"[a-za-z][0-9]+"

a1232344,abc1234,12345,b493034

"^[0-9]?a*b?.$"

0aaaax,aaab9,9x,88aabb,9zzzz

"a+b+c+[xyz]*"

aaaabbccccccxyxyz,abbbbccc***x,ababab***x

一旦你翻譯了它們,使用pythonre模組,嘗試在 shell 中嘗試它們,如下:

>>> import re

對於任何不匹配,你會得到attributeerror: 'nonetype',因為當你的正規表示式不匹配時,re.match函式返回none

挑戰練習

挑戰是嘗試使用你的 fsm 模組來實現乙個簡單的正規表示式,至少執行三個操作。這將是乙個困難的挑戰,但使用 pythonre庫來幫助你規劃和測試此正規表示式的實現。然後,一旦你知道如何實現它,永遠不要這樣做了。人生苦短,不要做計算機已經擅長的事情。

第一章 正規表示式

正規表示式是高階的文字模式匹配 抽取 或文字形式的搜尋和替換功能提供了基礎。正規表示式 簡稱regex 是由一些字元或特殊符號組成的字串,他們描述了模式的重複或表述多個字元,於是正規表示式能夠按照某一模式匹配一系列有相似特徵的字串。python使用re模組來支援正規表示式。符號描述 匹配0次或者多次...

python正規表示式 第一章

正規表示式包 re re.search pattern,string 其中pattern是字串形式提供的正規表示式,string是需要匹配的字串 使用 和 測試string有pattern完整匹配 re.search 0123456799 2 none true 只要有乙個匹配成功,就會返回true...

python 核心程式設計》第一章 正規表示式

import rem re.match foo bar foo print m.group footype m.group strm.group 返回匹配的字串 pattern foo bar m re.match pattern,foobarfooooooook print m.group foo...