2010-06-11 2 views
2

Я пытаюсь использовать регулярное выражение для поиска документа для номера UUID и замены его на новый номер. Код, который у меня есть до сих пор:Найдите строку и замените ее переменной

read_file = open('test.txt', 'r+') 
write_file = open('test.txt', 'w') 

r = re.compile(r'(self.uid\s*=\s*5EFF837F-EFC2-4c32-A3D4\s*)(\S+)') 
for l in read_file: 
    m1 = r.match(l) 
    if m1: 
     new=(str,m1.group(2)) 
     new?????? 

Это место, где я застреваю.

Файл test.txt имеет ниже UUID, хранящуюся в нем:

self.uid = '5EFF837F-EFC2-4c32-A3D4-D15C7F9E1F22' 

Я хочу, чтобы заменить часть D15C7F9E1F22.

Я также попытался это:

r = re.compile(r'(self.uid\s*=\s*)(\S+)') 
for l in fp: 
    m1 = r.match(l) 
    new=map(int,m1.group(2).split("-") 
    new[4]='RHUI5345JO' 

Но я не могу показаться, чтобы соответствовать строке.

Заранее благодарим за любую помощь.

+0

Я исправил и протестировал его: попробуйте сейчас. –

+0

Вы говорите о моем регулярном регулярном выражении? Я тоже исправил это. Извините за ошибку. –

ответ

3

Почему вы используете регулярное выражение для таких прямого форвардная замена?

не могли бы вы просто использовать

for l in read_file: 
    l.replace("5EFF837F-EFC2-4c32-A3D4-D15C7F9E1F22", 
       "5EFF837F-EFC2-4c32-A3D4-RHUI5345JO") 
    # Write to file.. 

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

1

Я думаю, что регулярное выражение выключен:

r = re.compile(r'(self.uid\s*=\s*5EFF837F-EFC2-4c32-A3D4\s*)(\S+)') 

Должно быть:

r = re.compile(r"(self\.uid\s*=\s*'5EFF837F-EFC2-4c32-A3D4-)([^']*)'") 

Затем, когда у вас есть матч, захватить группу 1 и присвоить его переменной и добавить вашу замену строка к нему.

Группа ([^']*) будет искать любой символ до отметки '. Это ваша цель удалить группу.

Редактировать: 11 июня 2010 г., 2:27 EST: У Джастин Пил есть хорошая точка. Вы можете выполнить прямой поиск и заменить эти данные. Если вы не ищете шаблон из 8 символов, а затем 4, 4, 4 и 12 ... В этом случае вы можете использовать шаблон:

r = re.compile(r"self\.uid\s*=\s*('\w{8}-(:?\w{4}-){3})(\w{12})'") 
+0

Я получаю синтаксическую ошибку для этого решения? – chrissygormley

+0

Спасибо за помощь, но у меня есть дополнительный кронштейн. Я попытался удалить его, но я не могу прочитать строку. Возможно, я снял кронштейн в неправильном месте. – chrissygormley

Смежные вопросы