我正在使用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]
我得出的结论是,我认为可以做得很好,但必须有缺陷或尽可能不干净。
缺少什么?
谢谢, 格特
答案 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'
如果您使用命名组,您将获得最好的世界。