正規表示式及Python中常見的相關函式

2021-09-21 00:28:00 字數 3699 閱讀 7882

在日常生活中,如果批量進行篩選或者操作某特定格式的資訊,乙個個進行操作工作效率會特別低,但使用正規表示式則可以大大提公升工作效率。正規表示式就是描述字串排列的一套規則,而這個規則是根據實際需求進行定義的。

1.常見列印字元與通用字元

符號含義

\n用於匹配乙個換行符

\t用於匹配乙個製表符

\w匹配任意乙個字母、數字或下劃線

\w匹配除字母、數字和下劃線以外的任意乙個字元

\d匹配任意乙個十進位制數

\d匹配除十進位制數以外的任意乙個其它字元

\s匹配任意乙個空白字元

\s匹配除空白字元以外的任意乙個其它字元

2.元字元

符號含義示例.

匹配除換行符以外的任意字元

.abc...

^匹配字串的開始位置

^abc:必須以abc開始才能匹配

$匹配字串的結束位置

abc$:必須以abc結尾才能匹配

*匹配0次、1次或多次前面原子

a*:*代表0個、1個或多個a都能匹配

?匹配0次或者1次前面的原子

a?:只有a或者aa能匹配

+匹配1次或者多次前面的原子

a+:+代表乙個或者多個a

前面的原子出現n次

a:即aa

(ab):abab

前面原子至少出現n次

a:兩個及以上a組成即可匹配

前面原子出現n到m次

a:出現2個a、3個a或者4個a都可以匹配

|模式選擇符,相當於或

^a|a$:指以a開頭或者以a結尾的都可以匹配

()模式單元符

(ab)*:將ab作為乙個整體進行匹配

3.原子表

在正規表示式中,原子表是比較常用的一種表達,即,括號內是原子符號,這相當於乙個集合,匹配時對該原子表進行全域性搜尋並判斷是否匹配,[abc]則表示由a、b、c組成的字串。[^abc]則表示不包括abc三個原子。

[a-z]:所有小寫字母                        [a-z]:所有大寫字母                    [a-za-z]:所有字母          [0-9]:表示所有數字

[^a-z]:除小寫字母以外                  [^a-z]:除大寫字母以外               [^a-za-z]:除所有字母以外    [^0-9]:除所有數字

4.幾個常見的示例

(1)匹配.com或.cn字尾的url**

首先需要了解url的構成再定義規則,pattern="[a-za-z]+://[^\s][.com|.cn]"

url中://是固定的,://之前不為空,則可以用[a-za-z]+或者[a-za-z]表示,最後結尾則是.com或者.cn,中間部分則根據需求來,都是非空字串,則可以用[^\s]表示。

(2)匹配**號碼

固定**有區號,區號有4位和3位,其中第一位基本以0開頭,區號之後是-,然後是八位數字,匹配規則:

pattern="0\d-\d|0\d-d"。

(3)匹配電子郵件位址

pattern="\w+([.+-]\w+)*@\w+([.+-]\w+)*\.\\w+([.+-]\w+)*"   其實郵箱位址分為三段,由@和.分為三段,而這三段的匹配規則一致,組合起來便是這個規則。

1.re.match()函式

re.match(pattern,string,flag):pattern代表正規表示式,string則表示源字串,flag則表示標誌位,比如模式修正符等,可省略。

注意:該方法必須從首字元就開始匹配,否則匹配不通過。

**如下:

匹配成功的:

import re

str="021-87562893"

pattern = "0\d-\d|0\d-d"

result = re.match(pattern,str)

print(result)

執行結果:

匹配失敗的:

import re

str="3021-87562893"

pattern = "0\d-\d|0\d-d"

result = re.match(pattern,str)

print(result)

執行結果:

比較兩種情況,可以理解match()方法的特點。

2.re.search()函式

re.search(pattern,string,flag),各引數含義同上。只不過該函式會掃瞄整個字串,只要源字串中包含該模式即可匹配。

**如下: 

import re

pattern="0\d-\d|0\d-\d"

string="330214-8284393782771"

result = re.search(pattern,string)

print(result)

執行結果如下:

從結果可以看出,該函式會對源字串進行掃瞄。

3.全域性匹配函式

從上述兩個函式可以看出,即使源字串中有多個結果符合要求,也只會匹配乙個結果,而全域性匹配函式則可以將所有符合要求的都找出。

首先用re.compile(pattern)將定義的正規表示式進行預編譯;編譯後,使用編譯結果的findall(string)方法根據正規表示式在源字串中將匹配的結果全部找出。 

**如下:

import re

pattern="0\d-\d|0\d-\d"

string="330014-828439378077-1999188345"

p1 = re.compile(pattern)

result = p1.findall(string)

print(result)

執行結果如下:

4.re.sub()函式

re.sub(pattern,rep,string,max):pattern代表正規表示式,rep代表要替換成的字串,string代表源字串,max表示最多替換的次數,可預設,預設代表全部替換。

import re

pattern="word"

string="awordwddwordokwordwww"

rep="word"

result = re.sub(pattern,rep,string)

print(result)

執行結果如下所示:

以上是正規表示式的一些基礎以及python中常用函式的使用介紹。通過對正規表示式的深入理解,可以為後續的爬蟲打下基礎。 

Python中常見的正規表示式符號

匹配零次或一次前面的分組 匹配零次或多次前面的分組 匹配一次或多次前面的分組 匹配n次前面的分組 匹配n次或更多次前面的分組 匹配零次到m次前面的分組 匹配至少n次,至多m次前面的分組 或 或 對前面的分組進行非貪心匹配 spam 意味著字元必須以spam開始 spam 意味著字元必須以spam結束...

Python常見正規表示式

一 校驗數字的表示式 數字 0 9 n位的數字 d 至少n位的數字 d m n位的數字 d 零和非零開頭的數字 0 1 9 0 9 非零開頭的最多帶兩位小數的數字 1 9 0 9 0 9 帶1 2位小數的正數或負數 d d 正數 負數 和小數 d d 有兩位小數的正實數 0 9 0 9 有1 3位小...

python中常用正規表示式

print re.findall d 123abc 數字 1 2 3 print re.findall d abcaa123abc 非數字 a b c a a a b c print re.findall abc 123abcaaabc abc abc print re.findall aa nab...