2012-10-30 50 views
2

這是這樣一個基本的perl的能力我必須相信你能做到這一點在Python,但我無法找到的文檔任何東西,當然除非它隱含的蟒紋多個領域......記住匹配

下面是一個字符串解析時間字段的一個很簡單的例子:

time=re.search("(\d+):(\d+):(\d+)", variable) 

我明白如果成功匹配的對象將被創建。但我無法找到的是找出與3種模式匹配的值的方法,以便我可以將它們填入像小時,分鐘和秒等變量中。我發現的所有用法示例僅顯示一組()。

-mark

回答

5

match對象都有一個groups方法返回一個元組:

hours, minutes, seconds = re.search("(\d+):(\d+):(\d+)", variable).groups() 
+1

對於從組(()到組變量的元組進行解包的+1。 – PaulMcG

+0

請注意,這會給你字符串值,如果你想要整數你可以使用'map(int,...)'。 –

+0

我喜歡!我知道這樣做是必然的...... –

0

使用m.groups()列出所有的比賽。

3

可以使用groups方法來獲得匹配的組

>>> variable = '1:2:3' 
>>> time=re.search("(\d+):(\d+):(\d+)", variable) 
>>> print time 
<_sre.SRE_Match object at 0x7f3917211918> 
>>> print time.groups() 
('1', '2', '3') 

如果你只是想在第一組:

>>> print time.group(1) 
1 

或第二組(time.group(2))等。注意,這些都是總是字符串。我想通了 -

import time 
stime = time.strptime(variable, '%H:%M:%S') 
hours, minutes, seconds = stime.tm_hour, stime.tm_min, stime.tm_sec 
+0

'time.group(0)'將返回整個匹配,而個別組可以使用基於1的編號檢索 – PaulMcG

3

使用time.strptimedatetime.datetime.strptime()


,如果你願意,你甚至可以命名組。我相信這對於經驗豐富的用戶來說顯而易見,但對於像我這樣的新手來說,我從來不會想到這一點。 3個值存儲在time.group(1),2和3

0

哇:

>>> time=re.search("(?P<HR>\d+):(\d+):(\d+)", variable) 
>>> time.group("HR") 
'1' 
1

你可以使用命名組:

>>> pattern = re.compile("(?P<hours>\d+):(?P<minutes>\d+):(?P<seconds>\d+)") 
>>> time = re.search(pattern, "12:34:56") 
>>> time.group("hours") 
'12' 
>>> time.group("minutes") 
'34' 
>>> time.group("seconds") 
'56' 
1

我會做你一個更好:

>>> import re 
>>> variable = "12:34:56" 
>>> time = re.search("(?P<hours>\d+):(?P<minutes>\d+):(?P<seconds>\d+)", variable) 
>>> time.group('hours') 
'12' 

docs for re瞭解更多詳情。