Почему флаг ignorecase (re.I) не работает в re.sub ()

Из pydoc:

re.sub = sub (pattern, repl, string, count = 0, flags = 0)
Верните строку, полученную путем замены самых левых неперекрывающихся вхождений шаблона в строке заменяющим repl. repl может быть либо строкой, либо вызываемой; если строка, обратная косая черта в ней обрабатывается. Если он является вызываемым, он передает объект соответствия и должен возвращать заменяемую строку, которая будет использоваться.

пример кода:

import re print re.sub('class', 'function', 'Class object', re.I) 

Никакая замена не производится, если я не изменю шаблон на «Класс».

Документация не упоминает ничего об этом ограничении, поэтому я предполагаю, что могу делать что-то неправильно.

Что здесь?

  • Управление консольным приложением Windows с stdin-каналом
  • Использование модуля Multiprocessing Python для одновременного и отдельного запуска моделей SEAWAT / MODFLOW
  • Как импортировать * с помощью __import__
  • Построение двух смежных матриц на одном и том же участке?
  • Код «Boilerplate» в Python?
  • Как заменить (или удалить) расширение из имени файла в Python?
  • Как получить имя таблицы для выполненного запроса? (python / sqlite)
  • Нет _dotblas.so после установки OpenBLAS и Numpy
  • 5 Solutions collect form web for “Почему флаг ignorecase (re.I) не работает в re.sub ()”

    Мне кажется, что вы должны делать:

     import re print re.sub('class', 'function', 'Class object', flags=re.I) 

    Без этого аргумент re.I аргументу count .

    Аргумент flagsпятый – вы передаете значение re.I в качестве аргумента count (сделать легкую ошибку).

    Примечание для тех, кто все еще занимается установкой Python 2.6.x или старше. Документация на Python для 2.6 re говорит:

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

    Это означает, что вы не можете передавать флаги непосредственно в sub. Они могут использоваться только с компиляцией:

     regex = re.compile('class', re.I) regex.sub("function", "Class object") 

    Чтобы избежать ошибок такого типа, можно использовать следующие исправления для обезьян:

     import re re.sub = lambda pattern, repl, string, *, count=0, flags=0, _fun=re.sub: \ _fun(pattern, repl, string, count=count, flags=flags) 

    ( * – запретить указывать count , flags как позиционные аргументы. _fun=re.sub – использовать re.sub -time-время re.sub )

    Демо-версия:

     $ python Python 3.4.2 (default, Oct 8 2014, 10:45:20) [GCC 4.9.1] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import re >>> re.sub(r'\b or \b', ',', 'or x', re.X) 'or x' # ?! >>> re.sub = lambda pattern, repl, string, *, count=0, flags=0, _fun=re.sub: \ ... _fun(pattern, repl, string, count=count, flags=flags) >>> re.sub(r'\b or \b', ',', 'or x', re.X) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: <lambda>() takes 3 positional arguments but 4 were given >>> re.sub(r'\b or \b', ',', 'or x', flags=re.X) ', x' >>> 

    Просто добавьте ответ Сеппо. Согласно http://docs.python.org/2.6/library/re.html , есть еще способ передать флаги непосредственно в «sub» в 2.6, что может быть полезно, если вам нужно сделать код 2.7 с большим количеством совместимого с 2.6. Чтобы процитировать руководство:

    … если вам нужно указать флаги регулярных выражений, вы должны использовать объект RE или использовать встроенные модификаторы в шаблоне; например, sub ("(? i) b +", "x", "bbbb BBBB") возвращает 'x x'

    а также

    (? iLmsux) (Одна или несколько букв из набора «i», «L», «m», «s», «u», «x».) Группа соответствует пустой строке; буквы устанавливают соответствующие флаги: re.I (игнорировать регистр), re.L (зависит от локали), re.M (многострочный), re.S (точка соответствует всем), re.U (зависит от Юникода) и re.X (verbose), для всего регулярного выражения. (Флаги описаны в разделе «Содержание модуля».) Это полезно, если вы хотите включить флаги как часть обычного выражения, вместо передачи аргумента флага функции re.compile ().

    На практике это означает

    print re.sub("class", "function", "Class object", flags= re.IGNORECASE)

    могут быть переписаны с использованием модификаторов (? ms) как

    print re.sub("(?i)class", "function", "Class object")

    Python - лучший язык программирования в мире.