假设我有一个如下所示的输入文件(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
我似乎无法弄清楚如何使用多组变量来处理这些行 非常感谢你。
答案 0 :(得分:2)
使用re?问题被改变了,这是我修改过的解决方案:
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()
使用两个dict
的{{1}}是从[键,值,键,值,...]列表创建字典的技巧
zip
是一个包含名称及其各自值的字典
trans
在@符号中捕获A,B或C.
r'@ ([ABC]) @'
函数传递了一个匹配对象,我们在其上调用lambda
方法。这将返回匹配括号组的元组,在本例中为A或B或C.我们将其用作字典groups()
的键,因此将其替换为值。
答案 1 :(得分:1)
不是简单的字符串替换工作吗?
>>> 'foo @ A @ @ B @'.replace('@ A @','12345')
'foo 12345 @ B @'
它会将所有出现的@ A @
替换为您想要的任何内容。您可以多次应用它,也许每个变量应用一次:
# 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)