Используйте регулярное выражение с fileinput - PullRequest
4 голосов
/ 15 июня 2010

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

r = re.compile(r"self\.uid\s*=\s*('\w{12})'")
for line in fileinput.input(['file.py'], inplace=True): 
    print line.replace(r.match(line), sys.argv[1]), 

Формат переменной в файле:

self.uid = '027FC8EBC2D1'

Я пытаюсь передать параметр в этом формате и использовать регулярное выражение для проверки правильности формата sys.argv[1], найти переменную, хранящуюся в этом файле, и заменить ее новой переменной.

Может кто-нибудь помочь. Спасибо за помощь.

Ответы [ 3 ]

6 голосов
/ 15 июня 2010

Вы можете использовать re.sub, который будет соответствовать регулярному выражению и выполнять подстановку за один раз:

r = re.compile(r"(self\.uid\s*=\s*)'\w{12}'")
for line in fileinput.input(['file.py'], inplace=True):
    print r.sub(r"\1'%s'" %sys.argv[1],line),
1 голос
/ 15 июня 2010

Вам нужно использовать re.sub(), а не str.replace():

re.sub(pattern, repl, string[, count])

Возвращает строку, полученную путем замены крайнего левого не перекрывающегося вхождения pattern в string заменой repl. Если шаблон не найден, string возвращается без изменений. repl может быть строкой или функцией; если это строка, любые экранированные символы в ней обрабатываются. ... Обратные ссылки, такие как \6, заменяются подстрокой, совпадающей с group 6 в шаблоне.

...

В дополнение к экранированию символов и обратным ссылкам, как описано выше, \g<name> будет использовать подстроку, соответствующую группе с именем name, как определено синтаксисом (?P<name>...). \g<number> использует соответствующий номер группы;

Быстрый тест с использованием \g<number> для обратной ссылки:

>>> r = re.compile(r"(self\.uid\s*=\s*)'\w{12}'")
>>> line = "self.uid = '027FC8EBC2D1'"
>>> newv = "AAAABBBBCCCC"
>>> r.sub(r"\g<1>'%s'" % newv, line)
"self.uid = 'AAAABBBBCCCC'"
>>> 
0 голосов
/ 15 июня 2010

str.replace(old, new[, count]) (старый, новый [, count]):

Возвращает копию строки с заменой всех вхождений подстроки old на новый .Если задан необязательный аргумент count , заменяются только первые вхождения счетчика.

re.match возвращает либо MatchObject, либо (скорее всего, в вашем случае) None, str.replace.

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