2012-10-30 28 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了解更多详情。