繁体   English   中英

Python有效地将货币符号和数字拆分为一个字符串

[英]Python efficiently split currency sign and number in one string

我有一个字符串,例如'$200,000,000''Yan300,000,000'

我想拆分货币和数字,并输出一个元组('$', '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循环和try-except来提高性能和可读性。 有什么建议么?

>>> 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指出我没有完全回答问题)

>>> 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')
>>> 
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不是以货币符号(或任何不是数字的开头), split_currency将引发ValueError。 如果您愿意,可以使用try...except来处理这种情况。

>>> 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:]

我敢打赌它不会更快...但是我认为它更具可读性

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

您可以为此使用正则表达式。

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)]))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM