我正在尝试进行一些数据分析,并且我想分析一些数字,问题是这些数字采用不同的字符串格式。这些是不同的格式:
“ 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,但是任何提取整数的方法都足够
我很高兴朝着正确的方向前进,因为我对正则表达式没有太多的经验,并且现在感觉卡住了。
答案 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')]