Несоответствие регулярных выражений Python - PullRequest
2 голосов
/ 22 декабря 2009

Я получаю разные результаты в зависимости от того, прекомпилирую ли я регулярное выражение:

>>> re.compile('mr', re.IGNORECASE).sub('', 'Mr Bean')
' Bean'
>>> re.sub('mr', '', 'Mr Bean', re.IGNORECASE)
'Mr Bean'

В документации Python говорится Некоторые функции являются упрощенными версиями полнофункциональных методов для скомпилированных регулярных выражений. Однако в нем также утверждается, что RegexObject.sub () имеет значение Идентично к функции sub () .

Так что здесь происходит?

Ответы [ 4 ]

12 голосов
/ 22 декабря 2009

re.sub() не может принять re.IGNORECASE, кажется.

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

sub(pattern, repl, string, count=0)

Return the string obtained by replacing the leftmost
non-overlapping occurrences of the pattern in string by the
replacement repl.  repl can be either a string or a callable;
if a string, backslash escapes in it are processed.  If it is
a callable, it's passed the match object and must return
a replacement string to be used.

Использование этого работает на своем месте, однако:

re.sub("(?i)mr", "", "Mr Bean")
5 голосов
/ 22 декабря 2009

вызов sub () уровня модуля не принимает модификаторы в конце. это аргумент "count" - максимальное количество экземпляров шаблона, которое нужно заменить.

4 голосов
/ 22 декабря 2009
>>> help(re.sub)
  1 Help on function sub in module re:
  2 
  3 sub(pattern, repl, string, count=0)
  4     Return the string obtained by replacing the leftmost
  5     non-overlapping occurrences of the pattern in string by the
  6     replacement repl.  repl can be either a string or a callable;
  7     if a callable, it's passed the match object and must return
  8     a replacement string to be used.

В re.sub отсутствует параметр функции для флагов регулярных выражений (IGNORECASE, MULTILINE, DOTALL), как в re.compile.

Альтернативы:

>>> re.sub("[M|m]r", "", "Mr Bean")
' Bean'

>>> re.sub("(?i)mr", "", "Mr Bean")
' Bean'

Редактировать В Python 3.1 добавлена ​​поддержка флагов регулярных выражений, http://docs.python.org/3.1/whatsnew/3.1.html. С 3.1 подпись, например, например. re.sub выглядит так:

re.sub(pattern, repl, string[, count, flags])
2 голосов
/ 22 декабря 2009

Из документации Python 2.6.4:

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

re.sub () не принимает флаг для установки режима регулярных выражений. Если вы хотите re.IGNORECASE, вы должны использовать re.compile (). Sub ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...