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