Python26,re.match 只返回最后一个匹配
以下是我的源文件内容:
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()
,并且要设置正确的参数(比如,使用不重复的组),这样才能避免匹配到你不想要的内容。由于你没有解释什么让那个“后续内容”与实际想要的内容不同,我在这里就没法进一步说明了。