python 33:正則表達(dá)式findall()和search()方法取得的值

正則表達(dá)式的findall()方法取得的值远搪,其類型是list,它的每一個(gè)元素是一個(gè)匹配的數(shù)據(jù),這個(gè)數(shù)據(jù)是一個(gè)元組筑悴。這個(gè)元組元素是分組们拙。為了使其第一個(gè)元素是匹配字符串,我們?cè)趯?xiě)正則表達(dá)式時(shí)阁吝,要把表達(dá)式在最外面用一個(gè)圓括號(hào)括起來(lái)砚婆。元組元素的順序是先外層,后內(nèi)層突勇;同層則按從左到右的順序装盯。

下面舉例說(shuō)明。為簡(jiǎn)便起見(jiàn)甲馋,只設(shè)一個(gè)匹配埂奈。這樣findall()方法取得的值,就是一個(gè)只有一個(gè)元素的列表定躏,這個(gè)元素是一個(gè)元組账磺。

>>>americaPhoneRegex = re.compile(r'''( (\d{3}|\(\d{3}\))? # area code

(\s|-|\.)? # separator

\d{3} # first 3 digits

(\s|-|\.) # separator

\d{4} # last 4 digits

(\s*(ext|x|ext.)\s*\d{2,5})? # extension

)''',re.VERBOSE)

>>> n=americaPhoneRegex.findall('222-222-2222ext.123')

>>> n

[('222-222-2222ext.123', '222', '-', '-', 'ext.123', 'ext.')]

注意,我們的正則表達(dá)式最外層有一對(duì)圓括號(hào)痊远,這樣使其第一個(gè)元素就是匹配字符串垮抗。

這個(gè)n就是findall()方法取得的值。它是一個(gè)列表碧聪,其中有一個(gè)元素冒版,這個(gè)元素是一個(gè)元組,可以看到它有6個(gè)元素逞姿。

>>> n[0][0]

'222-222-2222ext.123'

>>> n[0][1]

'222'

>>> n[0][2]

'-'

>>> n[0][3]

'-'

>>> n[0][4]

'ext.123'

>>> n[0][5]

'ext.'

>>> n[0][6]

Traceback (most recent call last):

? File "<pyshell#47>", line 1, in <module>

? ? n[0][6]

IndexError: tuple index out of range

接下來(lái)談?wù)劄槭裁催@個(gè)元組中有6個(gè)元素辞嗡。

這是正則表達(dá)式?jīng)Q定的。

正則表達(dá)式中的圓括號(hào)哼凯,就決定了分組的個(gè)數(shù)欲间。

在這個(gè)例子中楚里,一共有6對(duì)圓括號(hào)断部,所以,有6個(gè)分組班缎。

最外層的圓括號(hào)里面的匹配是第一個(gè)元素(下標(biāo)0)蝴光。

注意最后兩對(duì)括號(hào),是嵌套的达址,所以蔑祟,先是外層括號(hào)里面的內(nèi)容,后是內(nèi)層括號(hào)里面的內(nèi)容沉唠。

用search()方法取得的匹配對(duì)象疆虚,也可以用上面的方法得到其每一個(gè)分組。

>>> m=americaPhoneRegex.search('222-222-2222ext123')

>>>m.groups()

('222-222-2222ext123', '222', '-', '-', 'ext123', 'ext')

注意groups()方法返回一個(gè)元組,這個(gè)元組就包含所有的分組径簿。這個(gè)元組罢屈,就是findall()方法取得的列表的元素。

如果我們改寫(xiě)一下正則表達(dá)式篇亭,把最外層的圓括號(hào)去掉缠捌,得到的結(jié)果就不一樣。

>>> americaPhoneRegex = re.compile(r''' (\d{3}|\(\d{3}\))? # area code

(\s|-|\.)? # separator

\d{3} # first 3 digits

(\s|-|\.) # separator

\d{4} # last 4 digits

(\s*(ext|x|ext.)\s*\d{2,5})? # extension

''',re.VERBOSE)

>>> m=americaPhoneRegex.search('222-222-2222ext123')

>>> m.groups()

('222', '-', '-', 'ext123', 'ext')

可以看到只有5個(gè)元素译蒂。整體的匹配字符串沒(méi)有了曼月。

對(duì)于findall()方法,結(jié)果也是這樣改變的:

>>> n=americaPhoneRegex.findall('222-222-2222ext.123')

>>> n

[('222', '-', '-', 'ext.123', 'ext.')]

但是柔昼,對(duì)于search()方法得到的值的group(0)方法哑芹,仍然可以得到整體匹配字符串:

>>> m.group(0)

'222-222-2222ext123'

參數(shù)為1,2捕透,3绩衷,4,5分別是各分組內(nèi)容:

>>> m.group(1)

'222'

>>> m.group(2)

'-'

>>> m.group(3)

'-'

>>> m.group(4)

'ext123'

>>> m.group(5)

'ext'

>>> m.group(6)

Traceback (most recent call last):

? File "<pyshell#28>", line 1, in <module>

? ? m.group(6)

IndexError: no such group

不論外面是否有圓括號(hào)激率,search()方法得到的值的group()方法咳燕,當(dāng)參數(shù)為0時(shí),得到的都是匹配字符串乒躺。但有無(wú)圓括號(hào)會(huì)影響參數(shù)為1及以后時(shí)的分組招盲,有圓括號(hào)會(huì)增加一個(gè)分組(就是匹配字符串)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嘉冒,一起剝皮案震驚了整個(gè)濱河市曹货,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌讳推,老刑警劉巖顶籽,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異银觅,居然都是意外死亡礼饱,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)究驴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)镊绪,“玉大人,你說(shuō)我怎么就攤上這事洒忧『拢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵熙侍,是天一觀的道長(zhǎng)榄鉴。 經(jīng)常有香客問(wèn)我履磨,道長(zhǎng),這世上最難降的妖魔是什么庆尘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任蹬耘,我火速辦了婚禮,結(jié)果婚禮上减余,老公的妹妹穿的比我還像新娘综苔。我一直安慰自己,他們只是感情好位岔,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布如筛。 她就那樣靜靜地躺著,像睡著了一般抒抬。 火紅的嫁衣襯著肌膚如雪杨刨。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,954評(píng)論 1 283
  • 那天擦剑,我揣著相機(jī)與錄音妖胀,去河邊找鬼。 笑死惠勒,一個(gè)胖子當(dāng)著我的面吹牛赚抡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纠屋,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼涂臣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了售担?” 一聲冷哼從身側(cè)響起赁遗,我...
    開(kāi)封第一講書(shū)人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎族铆,沒(méi)想到半個(gè)月后岩四,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哥攘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年剖煌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片献丑。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡末捣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出创橄,到底是詐尸還是另有隱情,我是刑警寧澤莽红,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布妥畏,位于F島的核電站邦邦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏醉蚁。R本人自食惡果不足惜燃辖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望网棍。 院中可真熱鬧黔龟,春花似錦、人聲如沸滥玷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惑畴。三九已至蛋欣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間如贷,已是汗流浹背陷虎。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杠袱,地道東北人尚猿。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像楣富,于是被迫代替她去往敵國(guó)和親谊路。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Python中的正則表達(dá)式(re) import rere.match #從開(kāi)始位置開(kāi)始匹配菩彬,如果開(kāi)頭沒(méi)有則無(wú)re...
    BigJeffWang閱讀 7,050評(píng)論 0 99
  • #首先缠劝,python中的正則表達(dá)式大致分為以下幾部分: 元字符 模式 函數(shù) re 內(nèi)置對(duì)象用法 分組用法 環(huán)視用法...
    mapuboy閱讀 1,597評(píng)論 0 51
  • 搞懂Python 正則表達(dá)式用法 Python 正則表達(dá)式 正則表達(dá)式是一個(gè)特殊的字符序列,它能幫助你方便的檢查一...
    廈熱閱讀 1,568評(píng)論 0 2
  • 一骗灶、破解密碼 1. 排列 代碼演示:import itertools#1惨恭。排列#從n個(gè)不同的元素中取出m(m <...
    hollow_02f9閱讀 2,169評(píng)論 0 0
  • Python中的re模塊--正則表達(dá)式 使用match從字符串開(kāi)頭匹配 以匹配國(guó)內(nèi)手機(jī)號(hào)為例,通常手機(jī)號(hào)為11位耙旦,...
    sunhaiyu閱讀 980評(píng)論 0 2