2012-02-19 212 views
5

這就是:重新模塊中的組和組之間有什麼區別?

import re 
>>>s = 'abc -j k -l m' 
>>>m = re.search('-\w+ \w+', s) 
>>>m.groups() 
() 
>>> m.group(0) 
'-j k' 

爲什麼groups()給我什麼,但group(0)產生了一些?有什麼不同?

跟進

代碼如下

>>>re.findall('(-\w+ \w+)', s) 
['-j k', '-l m', '-n o'] 

findall可以得到我所有的-\w+ \w+子,但看看這個:

>>>m = re.search('(-\w+ \w+)+', s) 
>>>m.groups() 
('-j k',) 

爲什麼不能search給予我所有的子字符串?

跟進再次

如果s = 'abc -j k -l m -k o,並

>>>m = re.search(r'(-\w+ \w+)+', s) 
>>>m.groups() 
('-l m ',)  # why just one substring? 
>>>m.group(0) 
'-j k -l m ' # as I expected 
+0

大多數正則表達式風格中的標準行爲是,當多次捕獲組中的任何內容時,替換*中的任何內容,而不是爲每次傳遞生成額外的組。如果你想捕獲所有這些,你必須反覆搜索。 're.findall()'應該對你有用。 – danielkza 2012-02-20 09:05:15

+0

@danielkza,但是爲什麼'groups()'給了我''-l m''而不是''-j k''? – Alcott 2012-02-20 10:39:26

+1

重複的第一遍匹配'-j k'。第二遍然後用新的'-l m'覆蓋存儲的比賽。如果接下來有更多的匹配,最後一個會被存儲。我無法告訴你爲什麼這種行爲存在,但它幾乎存在於所有正則表達式中。如果你想捕捉所有的比賽,你必須多次應用模式。 – danielkza 2012-02-20 11:54:48

回答

11

groups()只返回任何顯式捕獲組的正則表達式(由(圓括號)在你的正則表達式來表示),而group(0)回報無論您的表達式是否具有任何捕獲組,都與您的正則表達式匹配的整個子字符串。

您的正則表達式中的第一個明確的捕獲是由group(1)來代替。

再跟進編輯:

爲什麼不能search給我所有的子?

search()將僅返回與輸入字符串中的模式相匹配的第一個匹配項。

+0

原始文章編輯。 – Alcott 2012-02-19 10:44:00

+0

@Alcott:我添加了一個後續答案。 – BoltClock 2012-02-19 11:14:43

+0

呵呵。 「圓括號」。 – 2012-02-19 12:17:20

1

你的正則表達式沒有匹配組,由parens((...))表示。

2

讓我用一個小例子解釋

>>> var2 = "Welcome 44 72" 
>>> match = re.search(r'Welcome (\d+) (\d+)',var2) 
>>> match.groups() 
('44', '72') 
>>> match.groups(0) 
('44', '72') 
>>> match.groups(1) 
('44', '72') 
>>> match.group(0) 
'Welcome 44 72' 
>>> match.group(1) 
'44' 

說明:groups()是具有一切與你的正則表達式匹配模式的值的元組的類型。

groups(0)groups()groups(1) ....它只打印所有值

組()或基團(O) - >它會給與這與正則表達式模式匹配的值沿整個字符串。

組(1)將給出第一圖案匹配的值

組(2)將給第二圖案匹配的值....

相關問題