2013-06-06 2 views
6

Если у меня есть несколько строк, которые прочитали:Извлечение числовых данных Python

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

Каков наилучший способ захвата цифровых элементов (а именно только в первой инстанции) и первые скобки, если он существует.

Мой текущий подход состоит в том, чтобы использовать разделительную строку для каждого ' '. and str.isalpha, чтобы найти не-альфа-элементы. Но, не уверен, как получить первую запись в скобках.

ответ

4

вот подход с использованием регулярных выражений:

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 

или другой простой подход будет использовать регулярное выражение как это:

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

(я подумал о том, что один раз после написания предыдущего: - р)

полное объяснение последнего регулярного выражения:

(  <- 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,] +)»' бы дать мне один или более экземпляр любых чисел правых? Так что, если бы я хотел только один (первое число). Используйте '?' –

+0

или ваши 'groups() [0]' заботятся о том, что –

+0

'\ d' - это цифра; '[\ d,]' представляет собой цифру или запятую; '[\ d,]' - одна или несколько цифр/запятой; '()' группируют скобки, что делает 'groups()' working – zmo

1

Для извлечения числовых значений можно использовать повторно

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) 
Смежные вопросы