从Wikipedi的不同预算变量中提取整数价格

2024-05-14 07:31:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Python调用API并清理一组表示电影预算的字符串。你知道吗

到目前为止,我得到了以下6种数据变体。你知道吗

  1. “120万美元”
  2. “1433333美元”
  3. “200万美元”
  4. “1644736美元(估计)
  5. “600-700万美元”
  6. “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(',', ''))

Tags: totextnumberforinputstringifinteger
2条回答

使用regex和string replace方法,如果需要,我还添加了curency的返回。 相应地修改以处理更多的输入或乘数,如十亿等

import re
# take in string and return integer amount and currency
def clean_budget_string(s):
    mult_dict = {'million':1000000,'thousand':1000}
    tmp = re.search('(^\D*?)\s*((?:\d+\.?,?)+)(?:-\d+)?\s*((?:million|thousand)?)', s).groups()
    currency = tmp[0]
    mult = tmp[-1]
    tmp_int = ''.join(tmp[1:-1]).replace(',', '') # join digits and multiplier, remove comma
    tmp_int = int(float(tmp_int) * mult_dict.get(mult, 1))
    return tmp_int, currency


>>? clean_budget_string("$1.2 million")
(1200000, '$')
>>? clean_budget_string("$1,433,333")
(1433333, '$')
>>? clean_budget_string("US$ 2 million")
(2000000, 'US$')
>>? clean_budget_string("US$1,644,736 (est.)")
(1644736, 'US$')
>>? clean_budget_string("$6-7 million")
(6000000, '$')
>>? clean_budget_string("£3 million")
(3000000, '£') # my script don't recognize the £ char, might need to set the encoding properly

我处理这样一个解析任务的方法(我很高兴听到其他的意见)是将函数分解成几个部分,每个部分标识输入字符串中的一条信息。你知道吗

例如,我首先确定可以从字符串中解析出什么浮点数,暂时忽略货币和数量级(一百万,一千):

f = float(''.join([c for c in input_str if c in '0123456789.']))

(由于添加了类似于“est”的内容,您可能希望在结尾有一个点时添加错误处理。)

然后,在第二步中,确定是否需要将浮点相乘以调整正确的数量级。一种方法是使用多个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.']))

相关问题 更多 >

    热门问题