2016-06-20 7 views
-1

У меня есть этот список строк: $3 million, $910,000, $16.5-18 million [ 2 ].python extract number from string regular expression

Я пытаюсь преобразовать их в поплавка, так что для $3 million, это будет 3000000, и $16.5 - 18 million, я буду считать среднее 16.5 и 18.

Я попытался с помощью регулярных выражений: re.search('\$(.*)million', budget).group(1) найти часть между $ и million, но я не знаю, как обращаться типа с диапазоном ($16.5 - 18 million).

ответ

2

Я предлагаю это решение, которое позаботится об извлечении необходимого количества (диапазонов) из большего текста и преобразовании их в значения поплавка.

import re 
def xNumber(arg):   # This method will parse the suffix and return the corresponding multiplier, else 1 
    switcher = { 
     "mln": 1000000, 
     "million": 1000000, 
     "bln": 1000000000, 
     "billion": 1000000000, 
     "thousand": 1000, 
     "hundred": 100 
    } 
    return switcher.get(arg, 1) 

rx = re.compile(r'\$(?P<number>\d+(?:,\d{3})?(?:\.\d+)?(?:-\d+(?:,\d{3})?(?:\.\d+)?)?)(?:\s*(?P<suffix>mln|million|bln|billion|thousand|hundred))?') 
s = "$3 million, $910,000,$16.5-18 million" 
result = "" 
for match in rx.finditer(s): 
    if match.group("suffix") and match.group("number").find("-") == -1: # We have no range and have a suffix 
     result = str(float(match.group("number"))*xNumber(match.group("suffix"))) 
    elif match.group("number").find("-") > -1: # Range 
     lst = [float(x) for x in match.group("number").split("-")] 
     result = str(float(sum(lst))/len(lst)) + (" {}".format(match.group("suffix")) if match.group("suffix") else "") 
    else: result = float(match.group("number").replace(",","")) # Just return the number found converted to a float 
    print(result) 

Смотрите IDEONE demo

регулярное выражение r'\$(?P<number>\d+(?:,\d{3})?(?:\.\d+)?(?:-\d+(?:,\d{3})?(?:\.\d+)?)?)(?:\s*(?P<suffix>mln|million|bln|billion|thousand|hundred))?':

  • \$ - это $ символ
  • (?P<number>\d+(?:,\d{3})?(?:\.\d+)?(?:-\d+(?:,\d{3})?(?:\.\d+)?)?) - число с плавающей точкой с , как символ цифры группировки (необязательно) и необязательная десятичная часть и дополнительный диапазон
  • (?:\s*(?P<suffix>mln|million|bln|billion|thousand|hundred))? - соответствует альтернативным «суффиксам» после нулевого или более пробелов.