Фильтрация числа из разных форматов с помощью Regex - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь провести некоторый анализ данных, и я хочу проанализировать некоторые числа, проблема в том, что эти числа имеют разные строковые форматы. Это разные форматы:

"25 000 000 долларов США" или «9 500 долларов США» или "50000 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

Итак, я перебираю свой столбец данных и сначала выясню, к какой валюте относится число: «USD», «EUR» или «ETH», которые я сохраняю в c. Эта часть уже работает, после этого я хочу извлечь число в форме, которая может быть преобразована в целое число, чтобы я мог выполнять вычисления с ним.

Прямо сейчас, линия 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, но для извлечения целых чисел достаточно любого

Буду признателен за любой удар в правильном направлении, поскольку у меня нет большого опыта работы с регулярными выражениями и я чувствую себя застрявшим прямо сейчас.

Ответы [ 3 ]

0 голосов
/ 18 июня 2019

Оптимизированное решение с функциями 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
0 голосов
/ 18 июня 2019
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')]

0 голосов
/ 18 июня 2019
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...