2013-07-23 70 views
1

我有這樣'$200,000,000''Yan300,000,000'的Python地劃分貨幣符號和數字中一個串

我想在數字串分割的幣種和數量,並且輸出一個元組('$', '200000000'),而不','的字符串。

目前我使用下面的腳本,這是工作:

def splitCurrency(cur_str): 
    cuttingIdx = 0 
    for char in cur_str: 
     try: 
      int(char) 
      break 
     except ValueError: 
      cuttingIdx = cuttingIdx + 1 
    return (cur_str[0:cuttingIdx].strip(), 
      cur_str[cuttingIdx:len(cur_str)].replace(',','')) 

我想避免使用for循環和嘗試,除了性能和可讀性。有什麼建議麼?

回答

3
>>> import re 
>>> string = 'YAN300,000,000' 
>>> match = re.search(r'([\D]+)([\d,]+)', string) 
>>> output = (match.group(1), match.group(2).replace(',','')) 
>>> output 
('YAN', '300000000') 

(感謝zhangyangyu您指出我還沒有完全回答這個問題)

+2

的OP不希望「」中的號碼。您的解決方案不完整。 – zhangyangyu

+0

謝謝你,你的解決方案看起來對我來說最具可讀性:) – Mai

0
>>> import itertools 
>>> myStr = '$200,000,000' 
>>> ''.join(itertools.dropwhile(lambda c: not c.isdigit(), myStr)) 
'200,000,000' 
>>> myStr = 'Yan300,000,000' 
>>> ''.join(itertools.dropwhile(lambda c: not c.isdigit(), myStr)) 
'300,000,000' 

同樣,你可以使用itertools.takewhile具有相同lambda函數來獲取貨幣符號。然而,這可能是簡單的:

idx = itertools.dropwhile(lambda c: not c.isdigit()).next() 
sign, val = myStr[:idx], myStr[idx:] 
+0

謝謝您的解決方案 – Mai

0

它不會更快我打賭......但我認爲它更易讀

>>> cur_string = "asd1,23456,123,1233" 
>>> cur_sym = re.search(r"([^0-9, ]*)[0-9]","asd123").groups()[0] 
>>> cur = re.sub("[^0-9]","",cur_string) 
>>> print cur_sym,int(cur) 
asd 1234561231233 
+0

謝謝!這絕對比我的可讀性更強。 – Mai

1
>>> filter(str.isdigit, s) 
'200000000' 
>>> filter(lambda x: not x.isdigit() and x != ',', s) 
'$' 
>>> 
>>> (filter(lambda x: not x.isdigit() and x != ',' ,s), filter(str.isdigit, s)) 
('$', '200000000') 
>>> 
+0

謝謝你的建議。有趣的方法。 – Mai

1
import locale 
import re 
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') 

def split_currency(text): 
    _, currency, num = re.split('^(\D+)', text, 1) 
    num = locale.atoi(num) 
    return currency, num 
print(split_currency('$200,000,000')) 
# ('$', 200000000) 
print(split_currency('Yan300,000,000')) 
# ('Yan', 300000000) 

如果text不以貨幣符號(或任何非數字)開頭,將引發ValueError。如果您願意,您可以使用try...except來處理這種情況。

+0

謝謝你的建議。我想避免任何嘗試 - 除了性能,因爲我在大數據上運行這個。 – Mai

0

你可以使用這個正則表達式。

p1 = re.compile("\d") #match digits 
p2 = re.compile("\D") match non-digits 


currency_symbol = p1.split(cur_str)[0] 
value = int("".join([group for group in p2.split(cur_str)])) 
+0

我不確定此任務是否需要加入。 – Mai