6

読んだ行が数行ある場合:

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

数値要素 (つまり、最初のインスタンスのみ) と最初の括弧 (存在する場合) をキャプチャする最良の方法は何ですか。

私の現在のアプローチは、すべての文字列を分割し' '. and str.isalphaて非アルファ要素を見つけることです。しかし、括弧内の最初のエントリを取得する方法がわかりません。

4

2 に答える 2

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

(前の記事を書いた直後に考えました:-p)

最後の正規表現の完全な説明:

(      <- 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
 )
)
于 2013-06-06T14:51:12.517 に答える
1

抽出数値については、 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)
于 2013-06-06T14:55:52.463 に答える