2016-03-28 93 views
2

獲取字符串中數值列表的最簡潔方法是什麼?獲取字符串中數值列表的最簡單方法

例如:

string = 'version_4.11.2-2-1.4' 
array = [4, 11, 2, 2, 1, 4] 

正如你可能知道,我需要比較的版本。 「最乾淨」,我的意思是簡單/短/儘可能可讀。

另外,如果可能的話,我更喜歡內置函數而不是正則表達式(import re)。

這是我這麼遠,但我覺得這是相當笨拙:

array = [int(n) for n in ''.join(c if c.isdigit() else ' ' for c in string).split()] 

奇怪的是,我一直沒能找到對SO答案:

感謝

回答

6

只是比賽在連續數字上:

map(int, re.findall(r'\d+', versionstring)) 

無論數字之間有什麼; \d+與可以在行中找到的位數相匹配。這使您可以在Python 2所需的輸出:

>>> import re 
>>> versionstring = 'version_4.11.2-2-1.4' 
>>> map(int, re.findall(r'\d+', versionstring)) 
[4, 11, 2, 2, 1, 4] 

如果您正在使用Python 3,map()給你一個迭代map對象,所以要麼調用list()上或使用列表理解:

[int(d) for d in re.findall(r'\d+', versionstring)] 
+0

謝謝。我使用的是Python 2.所以我從它的所有其他答案中得出,使用內置函數可以實現的功能並不多,而且're'是最乾淨的解決方案。那是對的嗎? –

+0

@barakmanos're'是標準庫的一部分,將它視爲內置對象。對於您的特定問題,這是最乾淨的解決方案,是的。 –

5

我會用正則表達式來解決這個問題。

對於此任務,我更喜歡re.finditer而不是re.findallre.findall返回一個列表,re.finditer返回迭代器,所以這種解決方案,您將無法創建字符串的臨時列表:

>>> [int(x.group()) for x in re.finditer('\d+', string)] 
[4, 11, 2, 2, 1, 4] 
0

正則表達式是肯定要走的@MartijnPieters回答清楚地表明最好的辦法,但如果你不想使用它,你可能無法使用列表理解。這是你如何能做到這一點,雖然:

def getnumbers(string): 
    numberlist = [] 
    substring = "" 
    for char in string: 
     if char.isdigit(): 
      substring += char 
     elif substring: 
      numberlist.append(int(substring)) 
      substring = "" 
    if substring: 
     numberlist.append(int(substring)) 
    return numberlist 
+0

我認爲這並不比我在答案中已經有的更好。無論如何謝謝。 –

+0

您需要測試餘數;除非後面跟着非數字,否則您將錯過字符串中的最後一個數字。 –

+0

@MartijnPieters:這是一個我沒有注意到的錯誤,但現在已經修復。謝謝。 – zondo

0

您跟蹤每一個字符,並檢查它是否是一個數字,如果是你將它添加到列表,獲取更大的弦緩。

比方說,

import re 
    string='version_4.11.2-2-1.4.9.7.5.43.2.57.9.5.3.46.8.5' 
    l=map(int, re.findall('\d+',string)) 
    print l 

但願,這應該工作。 在上面的答案中不確定爲什麼我們使用'r'。

0

您可以簡單地使用正則表達式解決此問題。

import re 
string = 'version_4.11.2-2-1.4' 
p=re.compile(r'\d+') 
p.findall(string) 
相關問題