這一節我們來介紹下python中re模組為我們提供的一些屬性。使用這些屬性為正則匹配新增條件,可以有效的避免正規表示式複雜化。例如,在匹配時指定屬性re.i,可以使模式子串的匹配不區分大小寫.但是如果只使用正規表示式實現模式子串的匹配不區分大小寫,這時,正規表示式的書寫就會相對複雜。下面我們來一一介紹這些屬性。
(1)屬性re.s
上一節我們介紹了萬用字元"."可以表示任意字元,其實嚴格的說萬用字元"."可以匹配除換行符"\n"的任意字元.如下:
[python]view plaincopy
import re
r1=r"hello.world"
print(re.findall(r1,"hello\nworld"))
列印結果如下:
可以看到返回的是空字串,這說明r1="hello.world"中的萬用字元"."並不能匹配換行符"\n"。如果想讓萬用字元"."能夠匹配換行符"\n",就需要指定屬性re.s。如下:
[python]view plaincopy
import re
r1=r"hello.world"
print(re.findall(r1,"hello\nworld",re.s))
在呼叫re模組中的方法findall(pattern,string,flag)時,指定屬性flag=re.s,就可以實現萬用字元"."匹配包括換行符"\n"的任意字元。列印結果如下:
(2)屬性re.i
呼叫findall(pattern,string,flag)指定屬性flag=re.i的作用就是,對正規表示式中的模式子串匹配時不區分大小寫。例如r"hello",可以匹配到的模式子串有諸如"hello","hello","hello"等等。**例子如下:
[python]view plaincopy
import re
r=r"hello"
print(re.findall(r,"hello",re.i))
print(re.findall(r,"hello",re.i))
print(re.findall(r,"hello",re.i))
如上,在對模式子串"hello"匹配時指定屬性re.i,在主串中對其匹配時是不區分大小寫的。**列印結果如下:
(3)屬性re.m
re.m適用於對多行字串進行匹配,每一行都當做乙個主串來匹配。先看下面這個例子:
[python]view plaincopy
import re
r1=r"^hello"
s="""
hello world
world hello
hello mygf
mygf hello
"""print(re.findall(r1,s))
如上,正規表示式r1匹配主串s是否以"hello"開頭,若是則返回"hello",否則返回空字元。列印結果如下:
**中s明明是以"hello"開頭的字串,那麼返回的為什麼卻是空字元呢?在命令列中列印字串s,可以看到s的字串實質上如下:
我們在使用""" """時來書寫字串時,雖然看起來簡潔了許多,但無意間也增加了額外的換行符"\n",可以看到s='\nhello world\nworld hello\nhello mygf\nmygf hello\n',s是以換行符開頭的字串,所以使用正規表示式r"^hello"在主串s中匹配時返回為空字元。
解決這一問題的方法,就是在匹配模式子串時指定flag=re.m。這樣一來在匹配時就會一行一行的進行匹配,每一行都會匹配一次。如下**:
[python]view plaincopy
import re
r1="^hello"
s="""
hello world
world hello
hello mygf
mygf hello
"""print(re.findall(r1,s,re.m))
**列印結果如下:
可以看到,在指定屬性re.m後,對s中的每行字串都匹配是否以"hello"開頭,得到的結果如上。
(4)分組()
在正規表示式中,使用的是()來表示乙個分組,那麼什麼是分組呢?其實分組在正規表示式中就像是劃分塊,把乙個正規表示式劃分幾個小塊,以達到我們匹配的目的。如下,是乙個分組的例子:
[python]view plaincopy
import re
r1="\w@\w+(\.com|\.cn)"
print(re.match(r1,"[email protected]"))
print(re.match(r1,"[email protected]"))
print(re.match(r1,"[email protected]"))
如上r1是乙個對郵箱字串匹配的正規表示式,r1="\w@\w+(\.com|\.cn)",\w表示匹配乙個數字或者字母字元,r1匹配的是乙個3位字元(數字或字母)開始,中間為字元"@",後接若干字元(數字或者字母),最後以".com"或者".cn"結尾的郵箱字串。形如,"[email protected]"。列印結果如下:
當乙個正規表示式中含有分組時,使用findall(pattern,string)方法返回的是分組中的正規表示式匹配到的子串,利用這個特性,我們可以通過分組來獲取我們想要得到的資料。
如下**:
[python]view plaincopy
import re
s="""
name=zhangsan
name=lisi
name=wangwu
asd-hihihj
zxc4asd
"""r1=r"name=.+"
print(re.findall(r1,s))
如上,正規表示式r1=r"name=.+",r1匹配到的子串為字串"name="開始,".+"表示後接若干字元,是形如"name=zhangsan"這樣的子串。**列印結果如下:
而當我們需要獲取是"zhangsan"這樣的名字字串資料時,使用分組將我們需要的資料括起來,呼叫re模組的findall(pattern,string)方法,返回的就是分組中的正則匹配到的子串。**如下:
[python]view plaincopy
import re
s="""
name=zhangsan
name=lisi
name=wangwu
asd-hihihj
zxc4asd
"""r1=r"name=(.+)"
print(re.findall(r1,s))
**列印結果如下:
如上,r1=r"name=(.+)",將需要獲取的資料使用()括起來。通過列印結果可以看到,使用r1="name=(.+)"進行匹配時,再呼叫findall(pattern,string)返回的並不是正規表示式r1所匹配到的子串,而是分組中的正則匹配到的子串。
介紹了這麼多節正規表示式,下一節我們使用正規表示式來做乙個爬蟲的小專案,敬請期待。
19,正規表示式
grep i 不區分大小寫 v invert match 反選 c count 匹配次數 l files with matches 列印檔案名 l files without match 列印出不匹配的檔名 n line number 列印出匹配行的行號 h no filename 不列印檔案名 代...
Python 正規表示式學習(二)正規表示式語法
一,單一字元匹配 1 匹配任意字元 import re res re.match r a.abcd print res.group 列印結果 abc一點.表示匹配任意的字元。上面的 表示匹配a後面的任意兩個字元。必須從a開始。若寫成 b.則會發生錯誤。2 匹配指定字元 如 0 9a za z 表示 ...
python正規表示式學習
今天學習了python中有關正規表示式的知識。關於正規表示式的語法,不作過多解釋,網上有許多學習的資料。這裡主要介紹python中常用的正 則表示式處理函式。re.match 嘗試從字串的開始匹配乙個模式,如 下面的例子匹配第乙個單詞。import re text jgood is a handso...