3

次のような入力ファイル (temp.tmpl) があるとします。

PTF @
ARB @ C @ @ A @ @ C @
OSN @ B @ @ A @ 
SDA @ B @
CPN 3.23
SNL 3.26 

そして、他のファイル (candidate.txt) で:

A 3.323 B 4.325 C 6.32 D 723 E 8 F 9 G 1.782
H 7
I 4
J 9
K 10

そして、 A 、 B 、および C を割り当てられた値に置き換えたいと思いました。私のタスクでこれを達成する必要がある方法は、@ @ を探して変数 A、B、および C を見つけることです...そして、これが明らかに変数であることを知っています。次に、それらを交換します。これは私が試したことです:

reader = open('candidate.txt', 'r')
out = open('output.txt', 'w')

dictionary = dict()
for line in reader.readlines():
    pairs = line.split()
    for variable, value in zip(pairs[::2],pairs[1::2]):
        dictionary[variable] = value

#Now to open the template file
template = open('temp.tmpl', 'r')
for line1 in template:
    if line1[1]:
        confirm = line1.split(' ')[0].lower()
        symbol = line1.split(' ')[1]

        if confirm == 'ptf':
            next(template)

        elif symbol in line1:

            start = line1.find(symbol)+len(symbol)
            end = line1[start:].find(symbol)
            variable = line1[start:start + end].strip()
            print variable

そして、複数の変数セットを持つ行を処理する方法を理解できないようです。
よろしくお願いします。

4

2 に答える 2

2

レを使う?質問が変更されました。これが私の修正されたソリューションです。

import re

# Create translation dictionary
codes = re.split(r'\s',open('candidate.txt').read())
trans = dict(zip(codes[::2], codes[1::2]))

outfh = open('out.txt','w')
infh  = open('data.txt')

# First line contains the symbol, but has a trailing space!
symbol = re.sub(r'PTF (.).*',r'\1', infh.readline()[:-1])

for line in infh:
    line = re.sub('\\'+ symbol + r' ([ABC]) ' + '\\' + symbol,
               lambda m: '%s %s %s' % (symbol,trans[m.groups()[0]],symbol),
               line)
    outfh.write(line) 

outfh.close()

dict2 つの s を使用するのzipは、[キー、値、キー、値、...] リストから辞書を作成するためのトリックです。

trans名前とそれぞれの値を持つディクショナリです。
r'@ ([ABC]) @'@ 記号内の A または B または C のいずれかをキャプチャします。このlambda関数には、メソッドを呼び出している一致オブジェクトが渡されます。groups()これは、一致する括弧グループのタプルを返します。この場合は、A または B または C のいずれかです。これを辞書のキーに使用するためtrans、値に置き換えます。

于 2012-07-03T08:11:55.760 に答える
1

簡単な文字列の置き換えはあなたのために働きませんか?

>>> 'foo @ A @ @ B @'.replace('@ A @','12345')
'foo 12345 @ B @'

それはあなたが望むものにすべての出現を置き換え@ A @ます。複数回、おそらく変数ごとに1回適用できます。

# a dictionary of variable values,
# you'll probably read this from somewhere
values = { 'A': '123', 'B': '456' }

# iterate over variable names
for varname in values: 
    pattern = str.format('@ {} @', varname)
    value = values[varname]

    # data is your input string
    data = data.replace(pattern, value)
于 2012-07-03T08:02:35.677 に答える