Ты этого хочешь?:
import re
def ripl(mat):
return '%s, 0x%08X' % (mat.group(1),CalcCRC(mat.group(2)))
regx = re.compile(r'(_CalcCRC[(]\s*"(\w+)"\s*[)])')
def ReplaceCRC( file_path, regx = regx, ripl = ripl ):
with open(file_path,'r+') as f:
file_str = f.read()
print file_str,'\n'
if file_str:
file_str = regx.sub(ripl,file_str)
print file_str
f.seek(0,0)
f.write(file_str)
f.truncate()
РЕДАКТИРОВАТЬ
Я забыл инструкцию f.truncate()
, очень важно, в противном случае она остается хвостом, если переписанное содержимое короче исходного содержимого
.
РЕДАКТИРОВАТЬ 2
Джон Мачин,
Нет ошибки, мое решение верное, оно дает
printf( "0x%08X\n", _CalcCRC("THIS_IS_A_CRC"), 0x97DFEAC9 );
printf( "0x%08X\n", _CalcCRC("PATIENT_ZERO"), 0x0D691C21 );
Я не имелизменил его с вашего комментария.Я думаю, что сначала я опубликовал решение, которое было неправильным (потому что я выполнил несколько различных тестов, чтобы проверить некоторые поведения и, вы знаете, я иногда смешиваю свои файлы и коды), затем вы скопировали этот неправильный код, чтобы попробовать его,Затем я понял, что произошла ошибка, и исправил код, а затем вы опубликовали свой комментарий, не заметив, что я исправил.Я не представляю другой причины такой путаницы.
Кстати, для получения того же результата в шаблоне даже нет необходимости в двух группах, определяющих regx , одной достаточно.Следующие regx
и ripl()
также работают:
regx = re.compile(r'_CalcCRC\(\s*"(\w+)"\s*\)')
# I prefer '\(' to '[(]', and same for '\)' instead of '[)]'
def ripl(mat):
return '%s, 0x%08X' % (mat.group(),CalcCRC(mat.group(1)))
Но остается неопределенность.Каждый наш результат мудр, относительно неточной формулировки Джо.Итак, чего он хочет в качестве точного результата?: должно ли значение 0x97DFEAC9 быть вставлено в CalcCRC("THIS_IS_A_CRC")
, как в вашем результате, или после CalcCRC("THIS_IS_A_CRC")
, как в моем?
Чтобы сказать все, я хотел, чтобы вы получили код, которыйможно запустить: я определил собственную функцию CalcCRC () , состоящую просто из if x=="THIS_IS_A_CRC": return 0x97DFEAC9
и if x=="PATIENT_ZERO": return 0x0D691C21
;Я обнаружил эти ассоциации, увидев результаты, которые Джо желал раскрыть в своем вопросе.
Теперь, касаясь вашего противного утверждения, что мой «пункт о переопределении функций - полная чушь» , я думаюЯ недостаточно объяснил, что я имею в виду.Размещение регулярного выражения regx и функции ripl () в качестве аргументов по умолчанию для параметров функции ReplaceCRC () имеет следствие: объекты regx и ripl () создаются только один раз, в настоящий момент выполняется определение функции ReplaceCRC () .Таким образом, в случае, если ReplaceCRC () будет применен несколько раз при выполнении, повторное создание этих объектов не будет.Я не знаю, действительно ли функция ReplaceCRC () вызывается несколько раз во время выполнения программы Джо, но я считаю хорошей практикой использовать эту функцию в коде на случай, если она может быть полезной.Возможно, я должен был подчеркнуть этот момент в своем ответе вместо комментария, чтобы оправдать мой код относительно вашего.Но я стараюсь ограничивать свою склонность писать иногда слишком длинные ответы.
Проясняются ли эти моменты, и ваше раздражение смягчается этими объяснениями?