我正在尝试使用 Python 调用 API 并清理一堆代表电影预算的字符串。
到目前为止,我得到了以下 6 种数据变体。
- “120 万美元”
- “$1,433,333”
- “200 万美元”
- “1,644,736 美元(预估)
- “6-700 万美元”
- “300万英镑”
到目前为止,我只解析了 1 和 2,下面的代码没有出现问题。处理所有其他情况或下面可能未列出的一般情况的最佳方法是什么?
def clean_budget_string(input_string):
number_to_integer = {'million' : 1000000, 'thousand' : 1000}
budget_parts = input_string.split(' ')
#Currently, only indices 0 and 1 are necessary for computation
text_part = budget_parts[1]
if text_part in number_to_integer:
number = budget_parts[0].lstrip('$')
int_representation = number_to_integer[text_part]
return int(float(number) * int_representation)
else:
number = budget_parts[0]
idx_dollar = 0
for idx in xrange(len(number)):
if number[idx] == '$':
idx_dollar = idx
return int(number[idx_dollar+1:].replace(',', ''))
最佳答案
我处理这样的解析任务的方法 - 我很高兴听到其他意见 - 将你的函数分解为几个部分,每个部分标识输入字符串中的一条信息.
例如,我首先确定可以从字符串中解析哪些 float ,暂时忽略货币和数量级(一百万、一千):
f = float(''.join([c for c in input_str if c in '0123456789.']))
(由于添加了“est”等内容,您可能需要在结尾出现尾随点时添加错误处理。)
然后,在第二步中,您确定是否需要乘以 float 来调整正确的数量级。一种方法是使用多个 if 语句:
if 'million' in input_str :
oom = 6
elif 'thousand' in input_str :
oom = 3
else :
oom = 1
# adjust number for order of magnitude
f = f*math.pow(10, oom)
当然可以改进这些检查,以通过使用正则表达式来解决格式方面的微小差异。
最后,您再次使用一个或多个 if 语句单独确定输入字符串中提到的货币:
if '£' in input_str :
currency = 'GBP'
else :
currency = 'USD'
现在还没有处理的一种情况是破折号,其中给出了下限和上限估计。使函数处理这些输入的一种方法是在破折号上拆分初始输入字符串,并使用第一个(或第二个)子字符串作为初始浮点解析的输入。因此,我们将用这样的内容替换第一行代码:
if '-' in input_str :
lower = input_str.split('-')[0]
f = float(''.join([c for c in lower if c in '0123456789.']))
else :
f = float(''.join([c for c in input_str if c in '0123456789.']))
关于python - 从维基百科的不同预算变体中提取整数价格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40753827/