Вопрос

В документах Python говорится:

re.МНОГОСТРОЧНЫЙ:Если указано, символ шаблона '^' совпадает в начале строки и в начале каждой строки (сразу после каждого перевода строки)...По умолчанию '^' совпадает только с началом строки...

Итак, что же происходит, когда я получаю следующий неожиданный результат?

>>> 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:

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

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

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

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

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

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

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

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

работает.

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

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

Полное определение re.sub является:

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

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

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

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

re.sub('^//', '', s, flags=re.M)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top