Я предлагаю это решение, которое позаботится об извлечении необходимого количества (диапазонов) из большего текста и преобразовании их в значения поплавка.
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))?
- соответствует альтернативным «суффиксам» после нулевого или более пробелов.