標籤:

Python正則表達式之初始篇:字元匹配

正則表達式是一個特殊的字元序列,它能幫助你方便的檢查一個字元串是否與某種模式匹配。

Python 自1.5版本起增加了re 模塊,它提供 Perl 風格的正則表達式模式。

re 模塊使 Python 語言擁有全部的正則表達式功能。

本章節主要介紹Python中常用的正則表達式模式與實例。

1. 正則表達式模式

模式字元串使用特殊的語法來表示一個正則表達式:

字母和數字表示他們自身。一個正則表達式模式中的字母和數字匹配同樣的字元串。

多數字母和數字前加一個反斜杠時會擁有不同的含義。

標點符號只有被轉義時才匹配自身,否則它們表示特殊的含義。

1.1 "^"

"^d" 代表的意思是以d元素開頭的任意一個字元串,也就是說只要是以d開頭的字元串,後面的元素不論是什麼,都是符合規則的,總之必須要以d開頭。

「.」 較為常用,其代表的意思是任意字元,其表示的範圍非常廣,可以接任意字元,不論是中英文,還是下劃線之類的特殊字元,都是可以代表的。舉個栗子,正則表達式「^d.」就是代表以d開頭的字元串,b後邊接任意字元都可以。

「*」 也十分常用,其代表的意思是前面的字元可以重複任意多遍,可以是0次,1次,2次等任意多次。

以下為第一個實例,匹配的正則表達式"^z.*" z開頭的後面接任意多任意類型的字母數字字元

如上圖所示,該正則表達式能夠順利匹配得到string中某部分。

1.2 "$"

「$」 代表的意思是結尾字元。舉個栗子,正則表達式「3$」,表示匹配以3為結尾的字元串。代碼演示如下圖所示。

看以下示例,很好理解,兩個正則表達式分別匹配0結尾和2結尾的實例,結果當然匹配不到2結尾的字元串。因為string結尾是0。

1.3 "?"

貪婪匹配:正則表達式一般趨向於最大長度匹配,也就是所謂的貪婪匹配。

非貪婪匹配:就是匹配到結果就好。

首先看一個『貪婪』的例子:

在這次貪婪模式的匹配下,匹配的是 "yes" and i say "no",因為默認為貪婪匹配,所以選取了最長的部分。

其次觀察一下如果是『非貪婪』的例子。

顯然,加入模式字元「?」之後,進入了非貪婪模式,而不會選取最長的那一段。

為了加深理解,再來看一個貪婪與非貪婪的實例。(d+表示單個以及多個數字)

看看這個貪婪例子,得到這個結果由於以下原因:

1.由於存在『.*』則這一部分在貪婪模式下會在滿足正則表達式的情況下讓匹配的段最長

2. d+表示任意長度的數字組合(至少有一個數字)

所以為了滿足1的貪婪條件,2的數字組合長度為1

而第二種情況下,在『.』後加上『?』使得前面這一段變的非貪婪(即匹配到滿足條件的即可),所以當它們匹配到第一個數字1時,就結束『.*』 這一部分的匹配,開始『d+』這一部分。

1.4 {}

「{}」實質上也是一個限定詞的用法,其限定前面字元所出現的次數,其常用的模式有三種,分別是「{數字}」、「{數字,}」和「{數字1, 數字2}」。舉個例子,如「{1}」、「{1,}」和「{1, 3}」。

1.形式A 限定{}前字元數量

如下圖所示,.{2}指定了兩個之間有2個字元,所以不會匹配只有一個中間字元的『pcp』,而且根據貪婪匹配原則,會選取前面『.*』最長的匹配結果所以選擇的是『pbap』而不是『pabp』,『pcpp』

2.形式B 「{1,}」代表的是前面的字元出現1次及以上;特殊字元「{2,}」代表的是前面的字元出現2次及以上;特殊字元「{3,}」代表的是前面的字元出現3次及以上;以此類推。舉個栗子,如下圖所示。

3.形式C 「{2, 3}」 代表的是前面的字元至少出現2次,最多出現3次;

注意,這裡採用了『非貪婪』模式,所以出現第一個符合匹配正則表達式的部分之後,該p前面的部分將最短。

1.5 "|"

豎線「|」實質上是一個或的關係。並且當兩個都滿足時會優先匹配最前面的

還能夠使用這種多層的匹配

為什麼這裡不是paa而是paap呢?因為match函數的規則。

也就是說re.match會從最左邊開始匹配,並且要求必須在起始位置開始匹配。

那麼這裡的匹配可以理解為:paap14是在起始位置的,而paa14和起始位置paap14不符合(這裡的起始不是指第一個,而是能從第一個字元向後匹配到某個字元,期間不斷不少,個人理解)

1.6 "[]"

正則表達式特殊符號是「[]」。中括弧十分實用,其有特殊含義,其代表的意思是中括弧中的字元只要滿足其中任意一個就可以。

A. 匹配模式為[abcd],在這裡正則表達式代表的意思是字元串第一個字元是abcd四個字元中的任意一個。

B. [0-9]代表是的是0到9中任意一數字

C. [a-z]代表26個英文小寫字母;[A-Z]代表26個英文大寫字母。

D. [^],在中括弧中加入特殊字元「^」,表示非,取反的意思。舉個栗子,「[^1]」的意思是字元不等於1。

還有一些用法,以下就不一一實例了

2.特殊字元類

2.1 「s」與「S」

「s」代表的意思是匹配空格

s* 匹配多個空格

「S」代表的意思與「s」代表的意思剛剛相反,也就是說匹配的那個字元只要不是空格,都可以匹配。

2.2 [u4E00-u9FA5]

[u4E00-u9FA5]特殊字元是固定的寫法,其代表的意思是漢字。換句話說,只要字元中是漢字,就可以通過該字元進行匹配,該特殊字元也是用中括弧括起來的。

2.3 "w"與"W"

「w」代表的意思是該字元為任意字元,但是和特殊字元「.」的意思不同。

「w」代表的字元主要包括26個大寫字母A到Z,即[A-Z]、26個小寫字母a到z,即[a-z]、10個阿拉伯數字0到9,即[0-9]和下劃線「_」。總結起來就是,「w」代表的意思是[A-Za-z0-9_]中任意一個字元。

「W」代表的意思與「w」剛剛相反,也就是匹配除了[A-Za-z0-9_]之外的其他字元。接上一步的例子,此時將「w」改為「W」。

對比:「.」 代表的意思是任意字元,其範圍比「w」代表的意思要廣。

3. 簡單應用

用以上所學的正則表達式字元和模式實現一個簡單的應用。

import re
string = Harold寫博客的時間是2019年1月14日
string2 = Harold寫博客的時間是2019/1/14
string3 = Harold寫博客的時間是2019-01-14
string4 = Harold寫博客的時間是2019年1月
string5 = Harold寫博客的時間是2019/1

reg_str = .*寫博客的時間是(d+[年/-]d{1,2}($|[月/-])(d{1,2}($|日)|$))

for i in {string,string2,string3,string4,string5}:
match_str = re.match(reg_str,i)
print(match_str.group(1))

# 2019年1月14日
# 2019年1月
# 2019/1/14
# 2019/1
# 2019-01-14

以下就是今天所「查漏補缺」的正則表達式,目前還只是最基礎的應用,下次會詳細寫python正則表達式的處理函數。

推薦閱讀:

TAG:Python入門 |