在python中替换文本

时间:2011-07-18 06:31:14

标签: python string

我已经写过文本文件,其中包含以下语句:

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,但它可能不适用于所有组合。 除了使用正则表达式之外,最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

从下面的讨论中,如果你想找到WriteBytes的所有第二个参数并提示替换,你可以这样做:

  1. 使用正则表达式解析文件以查找WriteBytes的所有第二个参数,并将它们存储在一个集合中(将为您处理重复项)

  2. 对于您看到的所有值,提示用户输入替换值,并将其存储在字典中

  3. 再次读取文件,并执行替换,将修改后的行与未修改的行一起存储在列表中

  4. 将数据写回磁盘。

  5. 示例代码:

    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()
    

    您可以避免以稍微复杂的代码为代价阅读文件两次(留给读者阅读)