заменить текст в питоне - PullRequest
0 голосов
/ 18 июля 2011

У меня был письменный текстовый файл, в котором у меня есть такие утверждения:

WriteByte(0x6000, 0x28);    // Register Value ...    

WriteByte(0x6002, 0x02);    //      

WriteByte(0x6004, 0x08);    //      

Я должен заменить 0x28 на пользовательское значение в качестве ввода
Это означает, что я должен заменить 0x28 на usr_valueкоторые могут быть 0x35 или 0x38 и т. д.
Также я также не могу рассчитывать, что только 0x28 может быть любым другим значением, содержимое которого должно быть заменено пользовательским содержимым.
Также, поскольку текстовый файл написан от рукив нем могут быть лишние пробелы или нет

WriteByte(0x6000,0x28); // Register Value ...

или

WriteByte( 0x6000 , 0x28);  // Register Value ...

Я пытался использовать string.replace, но он может работать не для всех комбинаций.Каков наилучший способ сделать это, кроме использования регулярных выражений?

1 Ответ

0 голосов
/ 18 июля 2011

Из приведенного ниже обсуждения, если вы хотите найти все вторые аргументы для WriteBytes и запросить замену, вы можете сделать что-то вроде этого:

  1. проанализировать файл, чтобы найти все2-й аргумент WriteBytes, используя регулярное выражение, и сохранить их в наборе (который будет обрабатывать дубликаты для вас)

  2. для всех значений, которые вы видели, запросить у пользователязначение замены и сохранить его в словаре

  3. , снова прочитать файл и выполнить замены, сохранив измененные строки в списке вместе с неизмененными строками

  4. записать данные обратно на диск.

Пример кода:

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

Вы можете избежать чтения файла дважды за счет немного более сложного кода (оставленного читателю в качестве упражнения)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...