Документы Python говорят:
re.MULTILINE: When specified, the pattern character '^' matches at the beginning of the string and at the beginning of each line (immediately following each newline)... By default, '^' matches only at the beginning of the string...
Так что же происходит, когда я получаю следующий неожиданный результат?
>>> 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:
re.sub(pattern, repl, string[, count, flags])
Четвертый аргумент - это счетчик, вы используете re.MULTILINE (который равен 8) как счетчик, а не как флаг.
Либо используйте именованный аргумент:
re.sub('^//', '', s, flags=re.MULTILINE)
Или сначала скомпилируйте регулярное выражение:
re.sub(re.compile('^//', re.MULTILINE), '', s)
вам не нужно компилировать его, если вы сообщаете python флаг, который вы ему передаете
@pseudosudo аргументы флагов были добавлены в Python 2.7, которого не существовало на момент публикации этого ответа. Я добавил информацию к ответу.
re.sub('(?m)^//', '', s)
@MJM В этом случае вам не нужен флаг MULTILINE в параметрах функции. У него уже есть встроенный флаг для многострочного: (?m)
Хороший @mypetlion - gotya (y)
re.sub(pattern, repl, string[, count, flags])
Это означает, что если вы сообщите Python, каковы параметры, вы можете передать flags без передачи count:
re.sub('^//', '', s, flags=re.MULTILINE)
или, более кратко:
re.sub('^//', '', s, flags=re.M)
@agf Ах, я не подумал смотреть на дату.
лучше бы
re.compile('^//', re.M).sub('', s)