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

1 投票
3 回答
660 浏览
提问于 2025-04-17 04:48

以下是我的源文件内容:

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 个回答

2

在编程中,有时候我们会遇到一些问题,想要找到解决方案。比如说,有人可能在使用某个工具或库时,遇到了错误或者不明白的地方。这时候,他们会在网上寻找帮助,像是StackOverflow这样的网站就是一个很好的选择。在这些地方,大家可以提问,也可以回答别人的问题。

在提问时,最好把问题描述得清楚明了,这样别人才能更好地理解你的困扰,给出有效的建议。同时,提供一些代码示例也是很有帮助的,因为这样可以让别人看到你具体遇到的情况。

总之,利用好这些社区资源,可以让我们在编程的路上走得更顺畅。

>>> 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'
3

你可能想用 .findall() 这个方法。

pattern = re.compile(r'^(([^\n]+)=[\ ]*([^\n]+)\n)', re.MULTILINE)
pattern.findall(data)

Tim 的回答提供了更多的背景信息。

6

问题在于你重复了你的捕获组:

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

这意味着每次匹配时,之前的匹配结果会被覆盖。这是所有正则表达式引擎的正常行为;只有少数几个(比如 .NET)允许你在后面访问重复组的单独捕获结果。

所以你确实需要使用 re.findall(),并且要设置正确的参数(比如,使用不重复的组),这样才能避免匹配到你不想要的内容。由于你没有解释什么让那个“后续内容”与实际想要的内容不同,我在这里就没法进一步说明了。

撰写回答