簡體   English   中英

Python26,re.match僅返回最后一個匹配項

[英]Python26, re.match returns only the last 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()

麥可

問題是您要重復捕獲組:

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

這意味着每次匹配都將覆蓋先前的匹配。 這是所有正則表達式引擎中的預期行為; 只有極少數(如.NET)允許以后訪問重復組的各個捕獲。

因此,實際上您確實需要將re.findall()與正確的參數(例如,非重復組)一起使用,以避免re.findall()匹配。 由於您沒有解釋什么設置了“跟進內容”與您真正想要的東西不同,因此在這里我無法進一步闡述。

您可能需要.findall()

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

蒂姆的答案提供了更多背景知識。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM