4

Pythonの「grep」の代替案と同様の質問。しかし、ここでの複雑さは、grepさ​​れたものが別のファイルからの変数(行)であるということです。re.findall()のような関数を使用してこれを行う方法を理解できません

file1:

1  20  200
1  30  300

file2:

1  20  200  0.1  0.5
1  20  200  0.3  0.1
1  30  300  0.2  0.6
1  40  400  0.9  0.6
2  50  300  0.5  0.7

file1の各行が私のパターンです。そして、file2からそのようなパターンを検索する必要があります。その場合、結果は次のようになります。

    1  20  200  0.1  0.5
    1  20  200  0.3  0.1
    1  30  300  0.2  0.6

私はbashまたはpythonのいずれかを使用して問題を解決しようとしていますが、理解できません。どうも

4

4 に答える 4

4

非正規表現ベースのソリューションは次のとおりです。

with open('/tmp/file1') as f:
  lines1 = f.readlines()

with open('/tmp/file2') as f:
  for line in f:
    if any(line.startswith(x.strip()) for x in lines1):
      print line,
于 2012-05-08T02:10:05.430 に答える
1

|正規表現の文字が左側のパターンまたは右側のパターンのいずれかに一致することを意味するという事実を利用できます。

import re

with open('file1') as file1:
    patterns = "|".join(re.escape(line.rstrip()) for line in file1)

regexp = re.compile(patterns)
with open('file2') as file2:
    for line in file2:
        if regexp.search(line):
            print line.rstrip()

サンプルファイルでこれを試したところ、次のように出力されました。

1   20  200 0.1 0.5
1   20  200 0.3 0.1
1   30  300 0.2 0.6

ちなみに、bash でこの問題を解決したい場合は、次のようにする必要があります。

grep -f file1 file2 
于 2012-05-08T01:52:42.857 に答える
0

自分のループが必要だと思います

file1patterns = [ re.Pattern(l) for l in f1.readlines() ]
lineToMatch = 0
matchedLines = []
for line in f2.readlines():
  if file1patterns[lineToMatch].matches(line):
    matchedLines += line
    lineToMatch += 1
  else:
    lineToMatch = 0
    matchedLines = []
  if len(matchedLines) == len(file1patterns)
    print matchedLines
    lineToMatch = 0
    matchedLines = []

(実際のPythonのコンパイルではありませんが、うまくいけば、前進するのに十分です)

于 2012-05-08T01:42:08.507 に答える
0

ステップ1:ファイル1からすべての行を読み込み、それらを分割して、タプルとしてセットに追加します。これは、次のステップでより高速なルックアップを実行するのに役立ちます。

with open('file1', 'r') as f:
    file1_lines = set([tuple(line.strip().split()) for line in f])

ステップ2:基準を満たすfile2の行をフィルタリングします。つまり、file1の行のいずれかで始まる場合です。

with open('file2', 'r') as f2:
    for line in itertools.ifilter(lambda x: tuple(x.split()[:3]) in file1_lines, f2):
        print line
于 2012-05-08T03:05:51.193 に答える