Подтвердить что ты не робот

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.'
4b9b3361

Ответ 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)