python - 从维基百科的不同预算变体中提取整数价格

标签 python regex string parsing

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

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

  1. “120 万美元”
  2. “$1,433,333”
  3. “200 万美元”
  4. “1,644,736 美元(预估)
  5. “6-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(',', ''))

最佳答案

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

例如,我首先确定可以从字符串中解析哪些 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/

相关文章:

HashMap 上的 Java 8 Map Reduce 作为 lambda

python - fatal error : 'Python.h' file not found while installing opencv

python - 确认图像已发布到 ROS

python - 如何编写 Python 正则表达式来获取 btrfs subvol ID

c# - 用正则表达式分割

javascript - 使用 charCodeAt 转换时出现 NaN 错误

python - 以表格格式漂亮地打印列表

python - 如何在 Python 中扩展/连接两个迭代器

正则表达式调试

python - 在 Python 中查找多个子字符串之一的最有效方法是什么?