私は以下のようなコードをいくつか持っています。ファイルの各行をいくつかのパターンで検索し、一致するパターンから文字列を抽出します。各行は、もしあれば、最大でも1つのパターンと一致するだけです。ファイルにはテキスト行だけがあり、行にはhight = 123、medium = 123、およびlow = 123があります。一例として、いくつかの不正なコードで下図のように私は、2番目の検索を行うことなしにマッチした部分を抽出することができればpython:一致するパターンを抽出するためのより良い方法は?
with open(file) as r:
for line in r:
if re.search('high=\d+', line):
p = re.search('high=(\d+)', line)
high = p.group(1)
elif re.search('medium=\d+', line):
p = re.search('medium=(\d+)', line)
medium = p.group(1)
elif re.search('low=\d+', line):
p = re.search('low=(\d+)', line)
low = p.group(1)
...
は今、私は思ったんだけど。検索されたパターンは、互いに非常に異なる可能性があります。ここでの問題は、re.search()がtrueを返した後で一致する部分を抽出する方法があるかどうかです。
with open(file) as r:
for line in r:
if re.search('high=(\d+)', line):
high = _.group(1) # invalid code, but looking for something like this.
elif re.search('medium=(\d+)', line):
medium = _.group(1) # invalid code
elif re.search('low=(\d+)', line):
low = _.group(1) # invalid code
...
注意これは私が望んでいたものではありませんが、それは私が望むものではありません。
with open(file) as r:
for line in r:
m = re.search('high=(\d+)', line)
if m:
high = m.group(1)
else:
m = re.search('medium=(\d+)', line)
if m:
medium = m.group(1)
else:
m = re.search('low=(\d+)', line)
if m:
low = m.group(1)
...
私は次のような、最初のパターンをコンパイルしようとしたが、私はエラーだ「NameError:定義されていない名前 『_』」を。私はpython2とpython3の両方でこれを試しました。 _.group(1)(いくつかのケースではうまくいきました)ではいくつかの特殊な振る舞いがあります。私は別の投稿で問題を提起するかもしれません。
h = re.compile('hight=(\d+)')
m = re.compile('medium=(\d+)')
l = re.compile('low=(\d+)')
with open(file) as r:
for line in r:
if h.search(line):
high = _.group(1)
elif m.search(line):
medium = _.group(1)
elif l.search(line):
low = _.group(1)
...
入力の例とそれから生成すると期待されるものがあれば助けになります。 – naktinis
@naktinisありがとうございます。私はいくつかの説明を追加しました。実際には質問は非常に簡単です。 re.search()がtrueを返した後、一致するパターンの一部を取得する方法はありますか? Perlではこれを行うことができます(一致する部分はグローバル変数に保存されます)。 – Shiping
Pythonにはグローバル変数への自動割り当てがありません。ラッパー関数を簡単に書くことができますが、言語に組み込まれていません。 –