2012-12-02 47 views
10

我解析了一些數據,其中的標準格式是一樣的東西10 pizzas的字符串。有時候,數據是正確輸入,我們可能最終5pizzas而不是5 pizzas。在這種情況下,我想解析出比薩餅的數量。拆分它的數字和字母之間切換

這樣做將是性格檢查字符,建立一個字符串,直到我們達到一個非數字,然後鑄造該字符串爲整數的用簡單的方式。

num_pizzas = "" 
for character in data_input: 
    if character.isdigit(): 
     num_pizzas += character 
    else: 
     break 
num_pizzas = int(num_pizzas) 

雖然這很笨拙。是否有一種更簡單的方法來將字符串從數字切換到字母字符?

回答

15

你問一種方式來分割的數字組成的字符串,但隨後在你的榜樣,你真正想要的只是第一號,這很容易與itertools.takewhile()完成:

>>> int("".join(itertools.takewhile(str.isdigit, "10pizzas"))) 
10 

這讓很多的感覺 - 我們正在做的是從字符串中取出字符,而它們是數字。這有一個好處,就是在我們到達第一個非數字字符後立即停止處理。

如果需要後來的數據量太大,那麼你正在尋找的是itertools.groupby()混合在一個簡單的list comprehension

>>> ["".join(x) for _, x in itertools.groupby("dfsd98sd8f68as7df56", key=str.isdigit)] 
['dfsd', '98', 'sd', '8', 'f', '68', 'as', '7', 'df', '56'] 

然後,如果您想使一個巨大的數字:

>>> int("".join("".join(x) for is_number, x in itertools.groupby("dfsd98sd8f68as7df56", key=str.isdigit) if is_number is True)) 
98868756 
1

怎麼樣一個正則表達式?

reg = re.compile(r'(?P<numbers>\d*)(?P<rest>.*)') 
result = reg.search(str) 
if result: 
    numbers = result.group('numbers') 
    rest = result.group('rest') 
11

要在數字分割字符串你可以使用re.split正則表達式\d+

>>> import re 
>>> def my_split(s): 
    return filter(None, re.split(r'(\d+)', s)) 

>>> my_split('5pizzas') 
['5', 'pizzas'] 
>>> my_split('foo123bar') 
['foo', '123', 'bar'] 

要找到第一個號碼使用re.search

>>> re.search('\d+', '5pizzas').group() 
'5' 
>>> re.search('\d+', 'foo123bar').group() 
'123' 

如果你知道電話號碼必須在字符串的開始,那麼你可以使用re.match,而不是re.search。如果你想找到的所有號碼,並丟棄其餘的則可以使用re.findall

相關問題