昨天學到了正規表示式基礎知識 :原子
今天開始學習第二個基礎知識:元字元
元字元
就是正規表示式中含有特殊含義的一些字元
常見的元字元及含義
符號
|
含義
|
.
|
匹配除換行符以外 的任意字元
|
^
|
匹配字串的開始位置
|
$
|
匹配字串的結束位置
|
*
|
匹配0次,1次,或多次前面的原子
|
?
|
匹配0次或一次前面的原子
|
+
|
匹配一次或多次前面的原子
|
{n}
|
前面的原子恰好出現n次
|
{n,}
|
前面的原子至少出現n次
|
{n,m}
|
前面的原子至少出現n次,至多出現m次
|
|
|
模式選擇符
|
()
|
模式單元符
|
具體的說,元字元分為:
(1)任意匹配元字元(2)邊界限制元字元(3)限定符(4)模式選擇符(5)模式單元符
下面用程式來觀察使用方法
import re
string1=”abcdfphp345pythony_py”#我們分別讓string1與下面的pattern進行匹配
pattern1=”.python…”#.是匹配除了換行符以外的字元
pattern2=”^abd”
pattern3=”^abc”
pattern4=”py$”
pattern5=”ay$”
pattern6=”py.*n”
pattern7=”cd{2}”
pattern8=”cd{3,}”
pattern9=”python|php”#可以把|當成‘或’理解
pattern10=”(cd){1,}”#小括號裡會被當成一個整體使用,這裡的意思是cd會至少出現一次
pattern11=”cd{1,}”#這裡就是d會至少出現一次
print(re.search(pattern1,string1))
print(re.search(pattern2,string1))
print(re.search(pattern3,string1))
print(re.search(pattern4,string1))
print(re.search(pattern5,string1))
print(re.search(pattern6,string1))
print(re.search(pattern7,string1))
print(re.search(pattern8,string1))
print(re.search(pattern9,string1))
print(re.search(pattern10,string1))
print(re.search(pattern11,string1))
#結果:
#<_sre.SRE_Match object; span=(10, 20), match=`5pythony_p`>
#None
#<_sre.SRE_Match object; span=(0, 3), match=`abc`>
#<_sre.SRE_Match object; span=(19, 21), match=`py`>
#None
#<_sre.SRE_Match object; span=(11, 17), match=`python`>
#None
#None
#<_sre.SRE_Match object; span=(5, 8), match=`php`>
#<_sre.SRE_Match object; span=(2, 4), match=`cd`>
#<_sre.SRE_Match object; span=(2, 4), match=`cd`>
模式修正
模式修正符就是在不改變正規表示式的情況下通過模式修正符改變正規表示式的含義
常見如下
符號
|
含義
|
I
|
匹配時忽略大小寫
|
M
|
多行匹配
|
L
|
做本地化識別
|
U
|
根據Unicode字元及解析字元
|
S
|
讓.匹配包括換行符,使用後.就可以匹配任意字元了
|
通過re.search(pattern1,string,re.I)修改即可
貪婪模式與懶惰模式
貪婪模式核心就是儘可能多的匹配,懶惰模式就是儘可能少的匹配。
pattern1=”p.*y”#貪婪模式
pattern2=”p.*?y”#懶惰模式,採用的就是就近匹配原則
print(re.search(pattern1,string1))
print(re.search(pattern2,string1))
#結果
#<_sre.SRE_Match object; span=(5, 21), match=`php345pythony_py`>
#<_sre.SRE_Match object; span=(5, 13), match=`php345py`>
如果我們想在字元間匹配任意字元,如“p.*y”預設是懶惰模式,通常在對應的.*後面加上?就可以從貪婪模式轉為懶惰模式
正規表示式常見函式
直接用程式碼理解
import re
string=”dpythonhbaigdukpythonabvjsvawegadbkvj”
pattern =”.python.”
print(re.match(pattern,string))
#會從string起始位置(開頭)開始匹配,不滿足返回None,滿足則返回匹配結果
#後面的不會匹配到
print(re.match(pattern,string).span())#會輸出匹配結果在源字串的位置
print(re.search(pattern,string))#會查詢整個字串得到匹配結果
上述每次只能匹配一個內容
如何將符合模式的內容全部匹配出來?
1:使用re.compile()對正規表示式進行預編譯。
2:編譯後,使用findall()根據正規表示式從源字元中將匹配內容全部找出
#pattern1=re.compile(“.python.”)
#print(pattern1.findall(string))
print(re.compile(pattern).findall(string))
如果想替換字串可以使用re.sub()方法
格式:re.sub(pattern 正規表示式,rep要替換的字元,string源字串,max最多替換次數)
如
re.sub(pattern.”php”,string,2)
常用例項
匹配.com或.cn的字尾URL
pattern=”[a-zA-Z]+://[^s]*[.com|.cn]”
string=”<a href=`http://www.baidu.com`>百度首頁</a>”
result=re.search(pattern,string)
print(result)
匹配電話號碼:
patternphone=”d{4}-d{7}|d{3}-d{8}”
匹配電子郵件
patternemail=”w+([.+-]w+)*@w+([.-]w+)*.w+([.-]w+)*”
正則就到這,明天開始學習cookie相關知識
此文是我在學習《精通Python網路爬蟲》(韋瑋著)的總結,純手打。