2016-06-20 14 views
-1

Ich habe diese Liste der Zeichenfolgen: $3 million, $910,000, $16.5-18 million [ 2 ].Python-Extrakt Nummer aus String regulären Ausdruck

Ich versuche, sie in float, zu konvertieren, so für $3 million, es 3000000 sein wird und für $16.5 - 18 million, werde ich den Durchschnitt von 16.5 und 18 nehmen.

Ich habe versucht, regex: re.search('\$(.*)million', budget).group(1) den Teil zwischen $ und million zu finden, aber ich weiß nicht, wie die Art mit einem Bereich ($16.5 - 18 million) zu handhaben.

Antwort

2

Ich schlage vor, diese Lösung, die die notwendige Anzahl (Bereiche) Extraktion aus größeren Text und die Konvertierung in die Float-Werte kümmern wird.

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) 

Siehe IDEONE demo

Die Regex ist r'\$(?P<number>\d+(?:,\d{3})?(?:\.\d+)?(?:-\d+(?:,\d{3})?(?:\.\d+)?)?)(?:\s*(?P<suffix>mln|million|bln|billion|thousand|hundred))?':

  • \$ - ein $ Symbol
  • (?P<number>\d+(?:,\d{3})?(?:\.\d+)?(?:-\d+(?:,\d{3})?(?:\.\d+)?)?) - die Float-Zahl mit , als Zifferngruppierung Symbol (optional) und ein optionaler Dezimalteil und ein optionaler Bereich
  • (?:\s*(?P<suffix>mln|million|bln|billion|thousand|hundred))? - entspricht den alternativen "Suffixen" nach null oder mehr Leerzeichen.
Verwandte Themen