1. 程式人生 > 實用技巧 >Redis執行緒模型

Redis執行緒模型


Regex 補充筆記


目錄

當前文章根據GitHub專案修改,檢視原文請點選GitHub圖示……

0、前言 正則表示式

正則表示式是用於"匹配"字元與符合組成的文字中的特殊子段。

正則表示式在匹配模式上是從左到右進行匹配,常用regex、regrexp表示。

如果在專案中需要匹配首字母大寫的單詞,則可以使用:

  • 正則表示式初試

    "^[A-Z]([a-z]+)"
    

1、字串子串匹配

正則表示式其實就是在執行搜尋時的格式,它由一些字母和數字組合而成。

如前言所示,正則表示式是大小寫敏感的,對於匹配固定的某個子串,可以直接將這個子字串作為表示式。

線上練習

2、元字元

元字元 描述
. 句號匹配任意單個字元除了換行符。
[ ] 字元種類。匹配方括號內的任意字元。
[^ ] 否定的字元種類。匹配除了方括號裡的任意字元。
* 匹配>=0個重複的在*號之前的字元。等價於{0, }
+ 匹配前面的子表示式一次或多次,等價於{1,} 。
? 標記?之前的字元為可選。匹配0次或者1次
{n,m} 匹配num個大括號之前的字元或字符集 (n <= num <= m)。
(xyz) 字符集,匹配與 xyz 完全相等的字串。
| 或運算子,匹配符號前或後的字元。
\ 轉義字元,用於匹配一些保留的字元 [ ] ( ) { } . * + ? ^ $ \
^ 從開始行開始匹配。
$ 從末端開始匹配。

常用表示式:

字元 描述
\s 匹配空白符的;包括空格,製表符(Tab),換行符等
\d 反斜槓加d可以匹配數字;後邊加數字{3}可以指定3個數字一起匹配
\b 表示單詞的邊界; re.findall(r'read\b','read app') 加r是取消字串的轉義
\w 匹配字母或數字或下劃線或漢字等
\. 匹配點號本身,取消字串的轉義用r,取消正則的轉義用來取消

\D、\S、\W、\B 是與小寫的相反的作用

正則表示式主要依賴於元字元。 元字元不代表他們本身的字面意思,他們都有特殊的含義。

[To the top](#Regex 補充筆記)


2.1 點運算子

.運算子匹配任意單個字元,但不匹配換行符。如:

".at" => The fat cat sat on the mat.

線上練習

2.2 字符集

字符集也叫做字元類。方括號用來指定一個字符集。在方括號中使用連字元-來指定字符集的範圍。在方括號中的字符集不關心順序。

如:我們使用 [a-z]+匹配連續的小寫字母。

線上練習

注意:在中括號中的.就表示.本身。

2.2.1 否定字符集

一般來說 ^ 表示一個字串的開頭,但它用在一個方括號內的開頭的時候,它表示這個字符集是否定的。

例如,表示式[^c]ar 匹配一個後面跟著ar的除了c的任意字元。

"[^c]ar" => The car parked in the garage.

線上練習

[To the top](#Regex 補充筆記)


2.3 重複匹配的次數

後面跟著元字元 +* or ? 的,用來指定匹配子模式的次數。這些元字元在不同的情況下有著不同的意思。

2.3.1 *

*號匹配 在*之前的字元出現大於等於0次。
例如,表示式 a* 匹配0或更多個以a開頭的字元。表示式[a-z]* 匹配一個行中所有以小寫字母開頭的字串。

關於上面的結果我們使用python的結果詳細展示:

>>> import re
>>> a = "The fat cat sat on the mat"
>>> re.findall("[a-z]*", a)
['', 'he', '', 'fat', '', 'cat', '', 'sat', '', 'on', '', 'the', '', 'mat', '']

這裡匹配到很多的空,在圖片中就是粉紅色的虛線!以第一個為例,單詞為The T不是小寫字母,但是*號允許匹配0個,所以第一個為空,而he fat中的he是小寫字母,因為*是允許匹配任意個前面的模式,所以第二個匹配到he,這裡我們注意空格是被看作特殊字元的。

*字元和.字元搭配可以匹配所有的字元.*
*和表示匹配空格的符號\s連起來用,如表示式\s*cat\s*匹配0或更多個空格開頭和0或更多個空格結尾的cat字串。

線上練習

[To the top](#Regex 補充筆記)

2.3.2 +

+號匹配+號之前的字元出現 >=1 次。
例如表示式c.+t 匹配以首字母c開頭以t結尾,中間跟著至少一個字元的字串。

"c.+t" => The fat cat sat on the mat.

2.3.3 ?

在正則表示式中元字元 ? 標記在符號前面的字元為可選,即出現 0 或 1 次。
例如,表示式 [T]?he 匹配字串 heThe

"[T]he" => The car is parked in the garage.
"[T]?he" => The car is parked in the garage.

線上練習

[To the top](#Regex 補充筆記)


2.4 大括號{}

在正則表示式中 {} 是一個量詞,常用來限定一個或一組字元可以重複出現的次數。
例如, 表示式 [0-9]{2,3} 匹配最少 2 位最多 3 位 0~9 的數字。

"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.

我們可以省略第二個引數。
例如,[0-9]{2,} 匹配至少兩位 0~9 的數字。

"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.

如果逗號也省略掉則表示重複固定的次數。
例如,[0-9]{3} 匹配3位數字

"[0-9]{3}" => The number was 9.9997 but we rounded it off to 10.0.

線上練習

[To the top](#Regex 補充筆記)


2.5 小括號(…)

特徵標群是一組寫在 (...) 中的子模式。(...) 中包含的內容將會被看成一個整體,和數學中小括號( )的作用相同。例如, 表示式 (ab)* 匹配連續出現 0 或更多個 ab。如果沒有使用 (...) ,那麼表示式 ab* 將匹配a後面連續出現 0 或更多個 b 。再比如之前說的 {} 是用來表示前面一個字元出現指定次數。但如果在 {} 前加上特徵標群 (...) 則表示整個標群內的字元重複 N 次。

我們還可以在 () 中用或字元 | 表示或。例如,(c|g|p)ar 匹配 cargarpar.

"(c|g|p)ar" => The car is parked in the garage.

我們使用()進行模型匹配:

>>> a = "catxxcatxxxcat cat a all cat xx"
>>> re.findall(r"cat(x)?", a)
['x', 'x', '', '', '']

注意這裡取的是小括號裡面的值!

如果我們想在cat後接任意個box,將這個組合匹配怎麼用python庫re解決呢?在正則表示式中可以將(…)作為一個整體,而re中只會匹配括號中的內容,小括號實現了[零寬度斷言(前後預查)](#4. 零寬度斷言(前後預查))的效果。

cat後接任意多個box的偽實現

>>> import re
>>> a = "catbox catboxboxall ie a cat."
>>> re.findall(r"cat(box){1,}", a)
['box', 'box']
>>> re.findall(r"cat[(box)]+", a)
['catbox', 'catboxbox']
>>> re.findall(r"cat[(box)]+", b)
['catbox', 'catb', 'catboxboxboxx']

上面的程式碼可以看出,使用[]組並不能實現想要的效果!

線上練習

[To the top](#Regex 補充筆記)


2.6 | 或運算子

或運算子就表示或,用作判斷條件。

例如 (T|t)he|car 匹配 (T|t)hecar

"(T|t)he|car" => The car is parked in the garage.

[To the top](#Regex 補充筆記)


2.7 轉碼特殊字元

反斜線 \ 在表示式中用於轉碼緊跟其後的字元。用於指定 { } [ ] / \ + * . $ ^ | ? 這些特殊字元。如果想要匹配這些特殊字元則要在其前面加上反斜線 \

例如 . 是用來匹配除換行符外的所有字元的。如果想要匹配句子中的 . 則要寫成 \. 以下這個例子 \.?是選擇性匹配.

"(f|c|m)at\.?" => The fat cat sat on the mat.

[To the top](#Regex 補充筆記)


2.8 錨點

在正則表示式中,想要匹配指定開頭或結尾的字串就要使用到錨點。^ 指定開頭,$ 指定結尾。

2.8.1 ^

^ 用來檢查匹配的字串是否在所匹配字串的開頭。

例如,在 abc 中使用表示式 ^a 會得到結果 a。但如果使用 ^b 將匹配不到任何結果。因為在字串 abc 中並不是以 b 開頭。

例如,^(T|t)he 匹配以 Thethe 開頭的字串。

"(T|t)he" => The car is parked in the garage.
"^(T|t)he" => The car is parked in the garage.

線上練習

2.8.2 $

同理於 ^ 號,$ 號用來匹配字元是否是最後一個。

例如,(at\.)$ 匹配以 at. 結尾的字串。

"(at\.)" => The fat cat. sat. on the mat.
"(at\.)$" => The fat cat. sat. on the mat.

線上練習

[To the top](#Regex 補充筆記)


3、簡寫字符集

正則表示式提供一些常用的字符集簡寫。如下:

簡寫 描述
. 除換行符外的所有字元
\w 匹配所有文字元號,包括中英文、日語、韓語等,等同於 [a-zA-Z0-9_]
\W 匹配所有非字母數字,即符號,等同於: [^\w]
\d 匹配數字: [0-9]
\D 匹配非數字: [^\d]
\s 匹配所有空格字元,等同於: [\t\n\f\r\p{Z}]
\S 匹配所有非空格字元: [^\s]
\f 匹配一個換頁符
\n 匹配一個換行符
\r 匹配一個回車符
\t 匹配一個製表符
\v 匹配一個垂直製表符
\p 匹配 CR/LF(等同於 \r\n),用來匹配 DOS 行終止符

3.1 \w測試

>>> import re
>>> a = "這裡是elfin的688直播間,歡迎大家@all.測試にほんご、한국어。"
>>> re.findall(r"\w+", a)
['這裡是elfin的688直播間', '歡迎大家', 'all', '測試にほんご', '한국어']

這裡的中英文標點符號都沒有匹配!

線上練習

[To the top](#Regex 補充筆記)


4. 零寬度斷言(前後預查)

先行斷言和後發斷言都屬於非捕獲簇(不捕獲文字 ,也不針對組合計進行計數)。
先行斷言用於判斷所匹配的格式是否在另一個確定的格式之前,匹配結果不包含該確定格式(僅作為約束)。

例如,我們想要獲得所有跟在 $ 符號後的數字,我們可以使用正後發斷言 (?<=\$)[0-9\.]*
這個表示式匹配 $ 開頭,之後跟著 0,1,2,3,4,5,6,7,8,9,. 這些字元可以出現大於等於 0 次。

零寬度斷言如下:

符號 描述
?= 正先行斷言-存在
?! 負先行斷言-排除
?<= 正後發斷言-存在
?<! 負後發斷言-排除

4.1 ?=... 正先行斷言

?=... 正先行斷言,表示第一部分表示式之後必須跟著 ?=...定義的表示式。

返回結果只包含滿足匹配條件的第一部分表示式。
定義一個正先行斷言要使用 ()。在括號內部使用一個問號和等號: (?=...)

正先行斷言的內容寫在括號中的等號後面。
例如,表示式 (T|t)he(?=\sfat) 匹配 Thethe,在括號中我們又定義了正先行斷言 (?=\sfat) ,即 Thethe 後面緊跟著 (空格)fat

"(T|t)he(?=\sfat)" => The fat cat sat on the mat.

線上練習

4.2 ?!... 負先行斷言

負先行斷言 ?! 用於篩選所有匹配結果,篩選條件為 其後不跟隨著斷言中定義的格式。
正先行斷言 定義和 負先行斷言 一樣,區別就是 = 替換成 ! 也就是 (?!...)

表示式 (T|t)he(?!\sfat) 匹配 Thethe,且其後不跟著 (空格)fat

"(T|t)he(?!\sfat)" => The fat cat sat on the mat.

線上練習

4.3 ?<= ... 正後發斷言

正後發斷言 記作(?<=...) 用於篩選所有匹配結果,篩選條件為 其前跟隨著斷言中定義的格式。
例如,表示式 (?<=(T|t)he\s)(fat|mat) 匹配 fatmat,且其前跟著 Thethe

"(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.

線上練習

4.4 ?<!... 負後發斷言

負後發斷言 記作 (?<!...) 用於篩選所有匹配結果,篩選條件為 其前不跟隨著斷言中定義的格式。
例如,表示式 (?<!(T|t)he\s)(cat) 匹配 cat,且其前不跟著 Thethe

"(?<!(T|t)he\s)(cat)" => The cat sat on cat.

線上練習

[To the top](#Regex 補充筆記)


5. 標誌

標誌也叫模式修正符,因為它可以用來修改表示式的搜尋結果。
這些標誌可以任意的組合使用,它也是整個正則表示式的一部分。

標誌 描述
i 忽略大小寫。
g 全域性搜尋。
m 多行修飾符:使錨點元字元 ^ $ 工作範圍在每行的起始

5.1 忽略大小寫 (Case Insensitive)

修飾語 i 用於忽略大小寫。
例如,表示式 r"the"gi 表示在全域性搜尋 the,在後面的 i 將其條件修改為忽略大小寫,則變成搜尋 theTheg 表示全域性搜尋。

>>> import re
>>> a = "The car is parked in the garage."
>>> re.findall(r"the", a)
['the']
>>> re.findall(r"the", a, re.I)
['The', 'the']

注意在python中我們常使用re庫進行正則

線上練習

修飾符 g 常用於執行一個全域性搜尋匹配,即(不僅僅返回第一個匹配的,而是返回全部)。
例如,表示式 r"(.at)"gi 表示搜尋 任意字元(除了換行)+ at,並返回全部結果。

g在python中我們使用re.findall()實現全域性搜尋。具體可參考上一節的程式碼!

線上練習

5.3 多行修飾符 (Multiline)

多行修飾符 m 常用於執行一個多行匹配。

像之前介紹的 (^,$) 用於檢查格式是否是在待檢測字串的開頭或結尾。但我們如果想要它在每行的開頭和結尾生效,我們需要用到多行修飾符 m

例如,表示式 /at(.)?$/gm 表示小寫字元 a 後跟小寫字元 t ,末尾可選除換行符外任意字元。根據 m 修飾符,現在表示式匹配每行的結尾。

>>> import re
>>> a = 'The fat \n cat sat \n on the mat.'
>>> re.findall(r".at.$", a)
['mat.']
>>> re.findall(r".at.?$", a)
['mat.']
>>> re.findall(r".at.?$", a, re.M)
['fat ', 'sat ', 'mat.']
>>> re.findall(r".at(.)?$", a, re.M)
[' ', ' ', '.']
# 注意在re庫中,使用re.findall(r".at(.)?$", a, re.M)不能正常匹配到資料!

關於小括號請參考[2.5 小括號(…)](#2.5 小括號(…))

線上練習

[To the top](#Regex 補充筆記)