Опция Python Regex MULTILINE не работает правильно? - PullRequest
4 голосов
/ 17 августа 2011

Я пишу простое средство обновления версий на Python, и движок регулярных выражений доставляет мне много проблем.

В частности, ^ и $ не совпадают правильно даже с опцией re.MULTILINE.Строка совпадает без ^ и $, но без радости в противном случае.

Буду признателен за помощь, если вы заметите, что я делаю неправильно.

Спасибо

target.c

somethingsomethingsomething
    NOTICE_TYPE revision[] = "A_X1_01.20.00";
somethingsomethingsomething

versionUpdate.py

fileName = "target.c"
newVersion = "01.20.01"
find = '^(\s+NOTICE_TYPE revision\[\] = "A_X1_)\d\d+\.\d\d+\.\d\d+(";)$'
replace = "\\1" + newVersion + "\\2"

file = open(fileName, "r")
fileContent = file.read()
file.close()

find_regexp = re.compile(find, re.MULTILINE)
file = open(fileName, "w")
file.write( find_regexp.sub(replace, fileContent) )
file.close()

Обновление : спасибо Джону и Итану задействительная точка.Тем не менее, регулярное выражение по-прежнему не соответствует, если я держу $.Он снова работает, как только я уберу $.

Ответы [ 2 ]

6 голосов
/ 17 августа 2011

Измените вашу замену на:

replace = r'\g<1>' + newVersion + r'\2'

Проблема, с которой вы столкнулись, заключается в том, что ваша версия приводит к следующему:

replace = "\\101.20.01\\2"

, что вводит в заблуждение дополнительный вызов, так как нет поля101. Из документации для модуля Python re :

\ g используется соответствующий номер группы;\ g <2>, следовательно, эквивалентно \ 2, но не является неоднозначным в замене, такой как \ g <2> 0.\ 20 будет интерпретироваться как ссылка на группу 20, а не ссылка на группу 2, за которой следует буквальный символ '0'.

2 голосов
/ 17 августа 2011

если вы сделаете print replace, вы увидите проблему ...

replace == '\\101.20.01\2'

и поскольку у вас нет 101-го совпадения, первая часть вашей линии теряется. Попробуйте вместо этого:

newVersion = "_01.20.01"
find = r'^(\s+NOTICE_TYPE revision\[\] = "A_X1)_\d\d+\.\d\d+\.\d\d+(";)$'
replace = "\\1" + newVersion + "\\2"

(перемещает часть матча, чтобы не было конфликта)

...