Python re.sub с флагом не заменяет все вхождения - PullRequest
54 голосов
/ 04 сентября 2008

Документы 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.'

Ответы [ 3 ]

110 голосов
/ 04 сентября 2008

Посмотрите на определение re.sub:

sub(pattern, repl, string[, count])

4-й аргумент - это счетчик, вы используете re.MULTILINE (что равно 8) в качестве счетчика, а не флаг.

Вы должны скомпилировать свое регулярное выражение, если хотите использовать флаги.

re.sub(re.compile('^//', re.MULTILINE), '', s)

Аргумент flags был добавлен в Python 2.7, поэтому полное определение теперь:

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

Что означает, что:

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

работает.

10 голосов
/ 25 марта 2010
re.sub('(?m)^//', '', s)
7 голосов
/ 30 августа 2011

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

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

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

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

или, точнее:

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