Вопрос:

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

python regex

33657 просмотра

3 ответа

36673 Репутация автора

Документы 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.'
Автор: cdleary Источник Размещён: 03.09.2008 09:00

Ответы (3)


110 плюса

17290 Репутация автора

Решение

Посмотрите на определение 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)
Автор: Moe Размещён: 03.09.2008 09:08

10 плюса

109 Репутация автора

re.sub('(?m)^//', '', s)
Автор: Ferran Размещён: 25.03.2010 04:10

7 плюса

1422 Репутация автора

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

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

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

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

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

re.sub('^//', '', s, flags=re.M)
Автор: pseudosudo Размещён: 30.08.2011 06:33
Вопросы из категории :
32x32