2

次のように、テキスト ファイルのすべての行を読み取ったとします。

ifile = open('myfile.txt')
lines = ifile.readlines()

さて、次の正規表現があるとします。

rgx = re.compile(r'Found ([0-9]+) solutions')

使うことができます

result = filter(rgx.match,lines)
print result

一致のリストを取得しますが、私が欲しいのは一致するグループのリストです。たとえば、次のような出力の代わりに:

Found 3 solutions
Found 35 solutions
Found 0 solutions

次のような出力が必要です。

3
35
0

これどうやってするの?

4

5 に答える 5

3
import re

rgx = re.compile(r'Found ([0-9]+) solutions')

with open('myfile.txt') as f:
    result = [m.group(1) for m in (rgx.match(line) for line in f) if m]

内側のループ(rgx.match(line) for line in f)は、 のように機能するジェネレータ式ですapply()。ファイルの各行に対してrgx.match()、オブジェクトを呼び出して結果を生成しSRE_Matchます (通常は単に「一致オブジェクト」と呼んでいます)。

外側のループにはif m、true と評価されない結果を破棄するものがあります (パターンが一致しない場合にre.match()戻ります)。None次にm.group(1)、一致オブジェクトを使用して、括弧内からテキストを取得します。re詳細については、モジュールのドキュメントを参照してください。外側のループはリスト内包表記の一部であるため、結果のリストが作成されて返されます。

于 2013-01-30T22:32:45.060 に答える
1

プレフィックスとサフィックスは固定文字列であるため、ルックアラウンドを使用できます。

r'(?<=Found )\d+(?= solutions)'

ただし、正規表現を使用して作業を行う方法があるはずです。

于 2013-01-30T22:13:24.757 に答える
1

残念ながら、match コマンドから "match" オブジェクトが返されます (フィルターを使用して暗黙的に文字列に変換しない限り)。経由で入手できる適切なドキュメントはありません。ipython のヘルプですが、オンラインです: http://docs.python.org/3/library/re.html#match-objects

例えば。

for line in lines:
  result = rgx.match(line)
  if not result: continue
  print result.group(1)
于 2013-01-30T22:23:08.090 に答える
1
print '\n'.join([m.group(1) for l in lines for m in [rgx.search(l)] if m])
于 2013-01-30T22:25:34.820 に答える