Python re.sub с флагом не заменяет все вхождения

Документы 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.'
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
63
0
40 471
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Посмотрите определение 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)

лучше бы re.compile('^//', re.M).sub('', s)

SilentGhost 25.03.2010 19:32

вам не нужно компилировать его, если вы сообщаете python флаг, который вы ему передаете

pseudosudo 30.08.2011 22:34

@pseudosudo аргументы флагов были добавлены в Python 2.7, которого не существовало на момент публикации этого ответа. Я добавил информацию к ответу.

agf 30.08.2011 22:43

re.sub('(?m)^//', '', s)

@MJM В этом случае вам не нужен флаг MULTILINE в параметрах функции. У него уже есть встроенный флаг для многострочного: (?m)

mypetlion 15.05.2020 02:50

Хороший @mypetlion - gotya (y)

MJM 14.07.2020 11:26

Полное определение re.sub:

re.sub(pattern, repl, string[, count, flags])

Это означает, что если вы сообщите Python, каковы параметры, вы можете передать flags без передачи count:

re.sub('^//', '', s, flags=re.MULTILINE)

или, более кратко:

re.sub('^//', '', s, flags=re.M)

@agf Ах, я не подумал смотреть на дату.

pseudosudo 30.08.2011 23:42

Другие вопросы по теме