[英]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.