вот подход с использованием регулярных выражений:
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
)
)
'«([\ d,] +)»' бы дать мне один или более экземпляр любых чисел правых? Так что, если бы я хотел только один (первое число). Используйте '?' –
или ваши 'groups() [0]' заботятся о том, что –
'\ d' - это цифра; '[\ d,]' представляет собой цифру или запятую; '[\ d,]' - одна или несколько цифр/запятой; '()' группируют скобки, что делает 'groups()' working – zmo