Python正则表达式匹配组具有超过预期的对象

时间:2015-10-10 00:08:20

标签: python regex

我正在使用re.search为3个独立的数据分析一行。 (日期温度和压力)这条线看起来像这样。

line= "2015-10-08-22-50   27.3   1015.03"

我想使用模式匹配,以便我可以非常强大地防止格式错误的行。因此,使用split失败了。

我建立了以下重新开始。

m= re.search("^(2\d{3}-\d{2}-\d{2}-\d{2}-\d{2})\s+(\d+.\d+)\s+(\d+.\d+)$", line)

解析很好,但是比赛组让我感到惊讶。

>>> m.groups(1)
('2015-10-08-23-00', '27.3', '1014.99')
>>> m.groups(2)
('2015-10-08-23-00', '27.3', '1014.99')
>>> m.groups(3)
('2015-10-08-23-00', '27.3', '1014.99')
我天真地想到了。

>>> m.groups(1)
('2015-10-08-23-00')
>>> m.groups(2)
('27.3')
>>> m.groups(3)
('1014.99')

现在我通过使用索引解决这个问题。

dt= m.groups(1)[0]
t = m.groups(2)[1]
p = m.groups(3)[2]

我得出的结论是,我认为可以做得很好,但必须有缺陷或尽可能不干净。

缺少什么?

谢谢, 格特

4 个答案:

答案 0 :(得分:3)

而不是:

m.groups(1)

我想你想要:

m.groups()[0]

groups()的参数是默认值,而不是它返回的元组中的位置。所以你不需要传递任何东西。你需要索引它返回的元组。

help(m.groups)
Help on built-in function groups:

groups(...)
    groups([default=None]) -> tuple.

    Return a tuple containing all the subgroups of the match, from 1.
    The default argument is used for groups
    that did not participate in the match

答案 1 :(得分:3)

to capture parenthesized subgroup
use group, not groups

print(m.group(1))

2015-10-08-22-50

print(m.group(2))
27.3

print(m.group(3))
1015.03

print(m.group(1,3))

('2015-10-08-22-50', '1015.03')

答案 2 :(得分:0)

m.groups()的参数不是要返回的捕获组。它是一个可选的默认值,可用于任何与任何内容都不匹配的捕获组。无论哪种方式,该函数都会返回一个包含所有捕获组的列表,您必须将其编入索引以获取特定的捕获组。

答案 3 :(得分:0)

您的模式没有任何问题。

您可以使用命名组来澄清:

>>> pat=re.compile(r"""^(?P<date>2\d{3}-\d{2}-\d{2}-\d{2}-\d{2})\s+
...                     (?P<temp>\d+.\d+)\s+
...                     (?P<pres>\d+.\d+)$""", re.X)
>>> line= "2015-10-08-22-50   27.3   1015.03"
>>> m=pat.search(line)

然后生成字典:

>>> m.groupdict()
{'date': '2015-10-08-22-50', 'temp': '27.3', 'pres': '1015.03'}
>>> m.group('date')
'2015-10-08-22-50'
>>> m.group('temp')
'27.3'

但也可以照常访问:

>>> m.group(1)
'2015-10-08-22-50'
>>> m.group(2)
'27.3'

或者索引groups()返回的元组,但我认为不是很清楚(正如你似乎发现的那样......)

>>> m.groups()[2]
'1015.03'

如果您使用命名组,您将获得最好的世界。