Python學習 19 正規表示式4

2021-09-20 14:14:19 字數 4186 閱讀 7568

這一節我們來介紹下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...