Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从维基百科的不同预算变量中提取整数价格_Python_Regex_String_Parsing - Fatal编程技术网

Python 从维基百科的不同预算变量中提取整数价格

Python 从维基百科的不同预算变量中提取整数价格,python,regex,string,parsing,Python,Regex,String,Parsing,我正在尝试使用Python调用API并清理表示电影预算的一组字符串 到目前为止,我有以下6种数据变体 “120万美元” “$14333333” “200万美元” “1644736美元(东部标准) “600-700万美元” “300万英镑” 到目前为止,我只解析了1和2,下面的代码没有问题。处理所有其他情况或下面可能没有列出的一般情况的最佳方法是什么 def clean_budget_string(input_string): number_to_integer = {'million' : 10

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

到目前为止,我有以下6种数据变体

  • “120万美元”
  • “$14333333”
  • “200万美元”
  • “1644736美元(东部标准)
  • “600-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(',', ''))
    

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

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

    f=float(''.join([c代表输入中的c,如果'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 '£' in input_str :
      currency = 'GBP'
    else :
      currency = 'USD'
    
    当然,可以通过使用正则表达式改进这些检查,以解释格式上的微小差异

    最后,再次使用一个或多个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 '£' 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.']))
    

    使用regex和stringreplace方法,如果需要,我还添加了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
    

    600-700万美元的输出应该是多少?600万美元应该是输出。对于中间的部分,应该是四舍五入。这太令人惊讶了。我认为第二次列表压缩也应该包括一个0,所以如果是0123456789中的c,它应该是。因为可能有一种情况是“$1288000”