Python и Regex для преобразования записанных чисел в числовые - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь преобразовать записанные числа в числовые значения.

Например, чтобы извлечь миллионы из этой строки:

text = 'I need $ 150000000, or 150 million,1 millions, 15 Million, 15million, 15Million, 15 m, 15 M, 15m, 15M, 15 MM, 15MM, 5 thousand'

Кому:

'I need $ 150000000, or 150000000,1000000, 15000000, 15000000, 15000000, 15000000, 15000000, 15000000, 15000000, 15000000, 15000000, 5 thousand'

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

def foldNumbers(text):
    """ to remove "," or "." from numbers """"
    text = re.sub('(?<=[0-9])\,(?=[0-9])', "", text) # remove commas
    text = re.sub('(?<=[0-9])\.(?=[0-9])', "", text) # remove points
return text

И я написал это регулярное выражение, чтобы найти все возможные шаблоны для общих обозначений Million.Это 1) находит цифры и смотрит в будущее для 2) общего обозначения для миллионов, 3) "[az]?"часть заключается в обработке необязательных «s» для миллионов или миллионов, где я уже удалил «».

re.findall(r'(?:[\d\.]+)(?= million[a-z]?|million[a-z]?| Million[a-z]?|Million[a-z]?|m| m|M| M|MM| MM)',text)

, который правильно соответствует миллионным числам и возвращает:

['150', '1', '15', '15', '15', '15', '15', '15', '15', '15', '15']

Что мне нужночтобы сделать сейчас, это написать шаблон замены, чтобы вставить «000000» после цифр, или перебрать и умножить цифры на 100000. Я пробовал это до сих пор:

re.sub(r'(?:[\d\.]+)(?= million[a-z]?|million[a-z]?| Million[a-z]?|Million[a-z]?|m| m|M| M|MM| MM)', "000000 ", text)

, который возвращает:

'I need $ 150,000,000, or 000000  million,000000  millions, 000000  Million, 000000 million, 000000 Million, 000000  m, 000000  M, 000000 m, 000000 M, 000000  MM, 000000 MM, 5 thousand'

Я думаю, что мне нужно оглянуться назад (? <=), Однако я не работал с этим до и после нескольких попыток, я не могу справиться с этим.</p>

К вашему сведению: я планирую сначала решить «Миллионы», а затем тиражировать решение для тысяч (K), миллиардов (B), триллионов (T) и, возможно, для других единиц, таких как расстояния, валюты и т. Д.Я искал SO и Google для каких-либо решений в NLP, очистки текста и майнинг статей, но не нашел ничего.

1 Ответ

0 голосов
/ 08 декабря 2018

Вы можете сделать это с помощью относительно простого re.sub: сопоставления

(?i)\b(\d+) ?m(?:m|illions?)?\b

захвата начальных цифр в группе и замены на эту группу, объединенную с 6 нулями:

r'\g<1>000000'

https://regex101.com/r/IedRP4/1

Код:

text = 'I need $ 150000000, or 150 million,1 millions, 15 Million, 15million, 15Million, 15 m, 15 M, 15m, 15M, 15 MM, 15MM, 5 thousand'
output = re.sub(r'(?i)\b(\d+) ?m(?:m|illions?)?\b', r'\g<1>000000', text)

(поскольку за группой в замене следуют цифры, убедитесь, что используется\g<#> синтаксис вместо \# синтаксис)

...