使用正则表达式过滤不同格式的数字

时间:2019-06-18 18:06:08

标签: python regex numbers expression

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

“ 25,000,000 USD”或 “ 9 500 USD”或 “ 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',''),如果数字是270000000

我想得到最好的结果是: 1亿 和 270000000,但是任何提取整数的方法都足够

我很高兴朝着正确的方向前进,因为我对正则表达式没有太多的经验,并且现在感觉卡住了。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

具有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

答案 2 :(得分:0)

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')]