Python re.sub с флагом не заменяет все вхождения
Документы Python говорят:
re.MULTILINE: если указано, символ шаблона '^' соответствует началу строки и в начале каждой строки (сразу после каждой новой строки)... По умолчанию '^' соответствует только в начале строки...
Итак, что происходит, когда я получаю следующий неожиданный результат?
>>> 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.'
Ответы
Ответ 1
Посмотрите на определение re.sub
:
re.sub(pattern, repl, string[, count, flags])
4-й аргумент - это число, вы используете re.MULTILINE
(который равен 8) в качестве числа, а не флага.
Либо используйте именованный аргумент:
re.sub('^//', '', s, flags=re.MULTILINE)
Или сначала скомпилируйте регулярное выражение:
re.sub(re.compile('^//', re.MULTILINE), '', s)
Ответ 2
re.sub('(?m)^//', '', s)
Ответ 3
Полное определение re.sub
:
re.sub(pattern, repl, string[, count, flags])
Это означает, что если вы сообщаете Python, каковы параметры, тогда вы можете передавать flags
без передачи count
:
re.sub('^//', '', s, flags=re.MULTILINE)
или, более кратко:
re.sub('^//', '', s, flags=re.M)