Python re.sub с флагом не заменяет все вхождения
-
09-06-2019 - |
Вопрос
В документах Python говорится:
re.МНОГОСТРОЧНЫЙ:Если указано, символ шаблона '^' совпадает в начале строки и в начале каждой строки (сразу после каждого перевода строки)...По умолчанию '^' совпадает только с началом строки...
Итак, что же происходит, когда я получаю следующий неожиданный результат?
>>> import re
>>> s = """// The quick brown fox.
... // Jumped over the lazy dog."""
>>> re.sub('^//', '', s, re.MULTILINE)
' The quick brown fox.\n// Jumped over the lazy dog.'
Решение
Посмотрите на определение re.sub
:
sub(pattern, repl, string[, count])
4-й аргумент - это количество, которое вы используете re.MULTILINE
(что равно 8) как количество, а не как флаг.
Вы должны скомпилировать свое регулярное выражение, если хотите использовать флаги.
re.sub(re.compile('^//', re.MULTILINE), '', s)
A flags
аргумент был добавлен в Python 2.7, так что теперь полное определение:
re.sub(pattern, repl, string[, count, flags])
Это означает , что:
re.sub('^//', '', s, flags=re.MULTILINE)
работает.
Другие советы
re.sub('(?m)^//', '', s)
Полное определение re.sub
является:
re.sub(pattern, repl, string[, count, flags])
Это означает, что если вы сообщите Python, каковы параметры, то вы можете передать flags
не проходя мимо count
:
re.sub('^//', '', s, flags=re.MULTILINE)
или, более кратко:
re.sub('^//', '', s, flags=re.M)