我已经写过文本文件,其中包含以下语句:
WriteByte(0x6000, 0x28); // Register Value ...
WriteByte(0x6002, 0x02); //
WriteByte(0x6004, 0x08); //
我必须用用户给定的值替换0x28作为输入
这意味着我用usr_value替换0x28,可能是0x35或0x38等。
此外,我也不能指望只有0x28它可以是任何其他值,其内容将由用户给定的内容替换。
此外,由于文本文件是手写的,它可能有额外的空格
WriteByte(0x6000,0x28); // Register Value ...
或
WriteByte( 0x6000 , 0x28); // Register Value ...
我尝试使用string.replace
,但它可能不适用于所有组合。
除了使用正则表达式之外,最好的方法是什么?
答案 0 :(得分:0)
从下面的讨论中,如果你想找到WriteBytes的所有第二个参数并提示替换,你可以这样做:
使用正则表达式解析文件以查找WriteBytes的所有第二个参数,并将它们存储在一个集合中(将为您处理重复项)
对于您看到的所有值,提示用户输入替换值,并将其存储在字典中
再次读取文件,并执行替换,将修改后的行与未修改的行一起存储在列表中
将数据写回磁盘。
示例代码:
import re
filename = '/tmp/toto.txt'
write_byte_re= r'WriteByte\([^,]+,\s*([^\)]+)\)'
# look for all potential substitutions
search_values = set()
f = open(filename)
for line in f:
print line
match_object = re.match(write_byte_re, line)
if match_object is None: # nothing found, keep looking
continue
else:
search_values.add(match_object.group(1)) # record the value
f.seek(0) # rewind file
substitutions = {}
for value in search_values:
print "What do you want to replace '%s' with? (press return to keep as is)"
new_value = raw_input('> ')
if new_value != '':
substitutions[value] = new_value
changed_lines = []
for line in f:
match_object = re.match(write_byte_re, line)
if match_object is not None:
value = match_object.group(1)
if value in substitutions: # not in the dictionary if the user said nothing
new_value = substitutions[value]
# modify line
line = re.sub('\b%s\b' % value, new_value, line)
changed_lines.append(line)
f.close()
# write output
f = open(filename, 'w')
f.writelines(changed_lines)
f.close()
您可以避免以稍微复杂的代码为代价阅读文件两次(留给读者阅读)