1

多くのファイルをいくつかの一般的なテンプレートと照合し、違いを抽出しようとしています。これを行うための最良の方法についての提案が欲しいのですが。例えば:

テンプレートA:

<1000 text lines that have to match>
a=?
b=2
c=3
d=?
e=5
f=6
<more text>

テンプレートB:

<1000 different text lines that have to match>
h=20
i=21
j=?
<more text>
k=22
l=?
m=24
<more text>

ファイルCを渡した場合:

<1000 text lines that match A>
a=500
b=2
c=3
d=600
e=5
f=6
<more text>

これがテンプレートAに一致すると簡単に言い、「a = 500」、「d=600」を抽出したいと思います。

これらを正規表現と一致させることはできますが、ファイルはかなり大きく、その正規表現を作成するのは面倒です。

私もdifflibを試しましたが、オペコードを解析して違いを抽出するのは最適ではないようです。

誰かより良い提案がありますか?

4

2 に答える 2

3

正確な形式がわからないので、追加のテキストを処理するために少し調整する必要があるかもしれませんが、それほど難しくはないはずです。

with open('templ.txt') as templ, open('in.txt') as f:
    items = [i.strip().split('=')[0] for i in templ if '=?' in i]
    d = dict(i.strip().split('=') for i in f)
    print [(i,d[i]) for i in items if i in d]

アウト:

[('a', '500'), ('d', '600')]  # With template A
[]                            # With template B

または整列している場合:

from itertools import imap,compress
with open('templ.txt') as templ, open('in.txt') as f:
    print list(imap(str.strip,compress(f,imap(lambda x: '=?' in x,templ))))  

アウト:

['a=500', 'd=600']
于 2013-01-23T16:29:55.987 に答える
0

パフォーマンスを調べていない:

  1. すべてを辞書にロードして、たとえばA = {'a': '?', 'b': 2, ...}、、B = {'h': 20, 'i': 21, ...}C = {'a': 500, 'b': 2, ...}

  2. A.keys() == C.keys()CがAと一致することがわかっている場合。

  3. 次に、両方の辞書を比較します。

必要に応じて改善します。

于 2013-01-23T16:39:44.213 に答える