【问题标题】:Filtering a number from different formats with Regex使用正则表达式过滤不同格式的数字
【发布时间】:2019-06-18 18:06:08
【问题描述】:

我正在尝试进行一些数据分析,并且我想要分析一些数字,问题是这些数字采用不同的字符串格式。这些是不同的格式:

“25,000,000 美元”或 “9 500 美元”或 “50,000 ETH”

它基本上总是一个数字,用逗号或空格分隔,然后是货币。根据币种,我想在之后计算美元金额。

过去一小时我一直在查找 Regex 表达式,但找不到任何可以解决我问题的方法。我确实取得了一些进展并实现了不同的表达方式,但没有一个是 100% 有效的。正如您将在下面看到的那样,它总是缺少一些东西。

for i, row_value in df2['hardcap'].iteritems():
    try:

        q = df2['hardcap'][i]
        c = re.findall(r'[a-zA-Z]+', q)
        if c[0] == "USD":
            d = re.findall(r'^(\d?\d?\d(,\d\d\d)*|\d)', q)
            #Do something with the number
        elif c[0] == "EUR":
            d = re.findall(r'^(\d?\d?\d(,\d\d\d)*|\d)', q)
            #Do something with the number
        elif c[0] == "ETH": 
            d = re.findall(r'^(\d?\d?\d(,\d\d\d)*|\d)', q)
            #Do something with the number
        print(d[0])   

    except Exception:
        pass

所以我正在遍历我的数据框列,首先,我找出数字与哪种货币相关,我保存在 c 中的“USD”、“EUR”或“ETH”。这部分已经可以了,在那之后,我想以可以转换为整数的形式提取数字,以便我可以用它进行计算。

现在,这条线 d = re.findall(r'^(\d?\d?\d(,\d\d\d)*|\d)', q) 在 d[0] 中返回类似的内容: ('100,000,000', ',000') 如果数字是 100,000,000 并且 ('270', '') 如果数字是 270 000 000

在最好的情况下,我希望得到的是: 100000000 和 270000000,但任何提取整数的方法都足够了

如果我在正则表达式方面没有太多经验并且现在感觉卡住了,我将不胜感激。

【问题讨论】:

    标签: python regex numbers expression


    【解决方案1】:
    import re
    
    s = '25,000,000 USD 9 500 USD 50,000 ETH'
    
    for g in re.findall(r'(.*?)([A-Z]{3})', s):
        print(int(''.join(re.findall(r'\d', g[0]))), g[1])
    

    打印:

    25000000 USD
    9500 USD
    50000 ETH
    

    【讨论】:

    • 哇,效果很好,非常感谢。太好了,我什至可以将“打印”部分保存在数组“a”中,然后在 a[0] 中包含数字,在 a[1] 中包含货币
    【解决方案2】:

    re.search + re.sub 函数的优化解决方案:

    import re
    
    # equivalent for your df2['hardcap'] column values
    hardcap = ["25,000,000 USD", "9 500 USD", "50,000 ETH"]
    
    pat = re.compile(r'^(\d[\s,\d]*\d) ([A-Z]{3})')
    for v in hardcap:
        m = pat.search(v)
        if m:    # if value is in the needed format
            amount, currency = m.group(1), m.group(2)
            amount = int(re.sub(r'\D*', '', amount))
            print(amount, currency)
    

    样本输出:

    25000000 USD
    9500 USD
    50000 ETH
    

    【讨论】:

    • 这也很好用,谢谢你的帮助。我的案例比我在这篇文章中展示的要复杂一些,我将尝试这两种解决方案并实施对我来说更好的解决方案,再次感谢!
    【解决方案3】:
    import re
    
    s = '25,000,000 USD 9 500 USD 50,000 ETH'
    matches = re.findall(r'(\d[\d, ]*) ([A-Z]{3})', s)
    l = [(int(match[0].replace(',', '').replace(' ', '')), match[1]) for match in matches]
    print(l)
    

    [(25000000, 'USD'), (9500, 'USD'), (50000, 'ETH')]

    【讨论】:

      猜你喜欢
      • 2019-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多