2013-06-06 18 views
6

Wenn ich einige Zeilen habe, die lesen:Extrahieren von numerischen Daten Python

1,000 barrels 
5 Megawatts hours (MWh) 
80 Megawatt hours (MWh) (5 MW per peak hour). 

Was ist der beste Weg, um die numerischen Elemente (nämlich nur die erste Instanz) und die ersten Klammern zu erfassen, wenn es vorhanden ist.

Mein aktueller Ansatz besteht darin, die Zeichenfolge für jede ' '. and str.isalpha zu teilen, um die Nicht-Alpha-Elemente zu finden. Aber nicht sicher, wie man den ersten Eintrag in den Klammern erhält.

Antwort

4

hier ist ein Ansatz mit regexps:

import re 

text = """1,000 barrels 
5 Megawatts hours (MWh) 
80 Megawatt hours (MWh) (...)""" 

r_unit = re.compile("\((\w+)\)") 
r_value = re.compile("([\d,]+)") 

for line in text.splitlines(): 
    unit = r_unit.search(line) 
    if unit: 
     unit = unit.groups()[0] 
    else: 
     unit = "" 
    value = r_value.search(line) 
    if value: 
     value = value.groups()[0] 
    else: 
     value = "" 
    print value, unit 

oder ein anderer einfacher Ansatz wäre eine regexp wie diese verwenden:

r = re.compile("(([\d,]+).*\(?(\w+)?\)?)") 
for line, value, unit in r.findall(text): 
    print value, unit 

(ich, dass man dachte kurz nach dem vorherigen Schreiben: - p)

vollständige Erklärung der letzten regexp:

(  <- LINE GROUP 
( <- VALUE GROUP 
    [ <- character grouping (i.e. read char is one of the following characters) 
    \d <- any digit 
    , <- a comma 
    ] 
    + <- one or more of the previous expression 
) 
.  <- any character 
*  <- zero or more of the previous expression 
\( <- a real parenthesis 
?  <- zero or one of the previous expression 
( <- UNIT GROUP 
    [ 
    \w <- any alphabetic/in-word character 
    + <- one or more of the previous expression 
    ] 
) 
?  <- zero or one of the previous expression 
\) <- a real ending parenthesis 
?  <- zero or one of the previous expression 
) 
) 
+0

' "([\ d,] +)"' würde ich ein oder mehrere Instanz von irgendwelchen Zahlen richtig benutzen können? Also was wenn ich nur eine (die erste Nummer) wollte. Verwenden Sie '?' –

+0

oder Ihre 'groups() [0]' kümmert sich darum –

+0

'\ d' ist eine Ziffer; '[\ d,]' ist eine Ziffer oder ein Komma; '[\ d,]' ist eine oder mehrere Ziffern/Komma; '()' gruppieren Klammern, die die 'groups()' funktioniert – zmo

1

Für numerische Werte Extraktion Sie re

import re 
value = """1,000 barrels 
      5 Megawatts hours (MWh) 
      80 Megawatt hours (MWh) (5 MW per peak hour)""" 
re.findall("[0-9]+,?[0-9]*", value) 
Verwandte Themen