Python26,re.match只返回最后一个匹配

时间:2011-10-22 14:24:24

标签: python regex

以下是我的源文件的内容:

Number= 010010
Name= Jan Mayen
Country= NORWAY
Lat=   70.9
Long=    8.7
...

似乎我的表达中存在重大错误或对re.match()的误解,因为我需要获取所有属性(而不仅仅是最后一个属性)。

>>> pattern = re.compile(r'^(([^\n]+)=[\ ]*([^\n]+)\n)+')
>>> print pattern.match(text).groups()
>>> ('Standard deviations=   3.0   3.0   2.5   1.7   1.0   0.9   0.8   1.1   1.1   1.6  2.2   2.5 \n', 'Standard deviations', '3.0   3.0   2.5   1.7   1.0   0.9 0.8   1.1   1.1   1.6 2.2   2.5 ')

有什么想法吗?

编辑:哦..以下有不同格式的内容,因此我不想使用re.findall()

迈克尔

3 个答案:

答案 0 :(得分:6)

问题在于您正在重复捕获组:

pattern = re.compile(r'^(...)+')

这意味着每次比赛都会覆盖上一场比赛。这是所有正则表达式引擎中的预期行为;只有少数(如.NET)允许以后访问重复组的各个捕获。

所以你实际上需要使用具有正确参数的re.findall()(例如,非重复组),避免你不想要的匹配。既然你没有解释除了你真正想要的内容之外的“跟随内容”的内容,我在这里就不能详细说明了。

答案 1 :(得分:3)

您可能需要.findall()

pattern = re.compile(r'^(([^\n]+)=[\ ]*([^\n]+)\n)', re.MULTILINE)
pattern.findall(data)
蒂姆的回答给出了更多背景知识。

答案 2 :(得分:2)

>>> text = '''Number= 010010
Name= Jan Mayen
Country= NORWAY
Lat=   70.9
Long=    8.7'''
>>> d = dict([re.split('=\w*', line, 1) for line in text.split('\n') if line])
>>> d
{'Country': 'NORWAY',
 'Lat': '70.9',
 'Long': '8.7',
 'Name': 'Jan Mayen',
 'Number': '010010'}
>>> d['Long']
'8.7'