Как регулярное выражение Python может игнорировать регистр внутри части шаблона, но не всего выражения?

Скажем, у меня есть строка, содержащая foobar fooBAR FOObar FOOBAR, и я хочу найти все экземпляры, содержащие нечувствительные к регистру "foo" или "FOO" но строчные буквы "bar". В этом случае re.findall должно вернуть ['foobar', 'FOObar'].

Принятый ответ на этот вопрос объясняет, что это можно сделать на C# с помощью (?i)foo(?-i)bar , но Python выдает ошибку недопустимого выражения.

Поддерживает ли библиотека регулярных выражений Python такую ​​функцию?


person Vortico    schedule 05.06.2011    source источник
comment
@Donal Fellows: Да, это тоже возможно, но не так часто, как чисто прописные или строчные foos в моем приложении. Возможно было бы реализовать далеко не идеальное решение и протестировать только эти два случая.   -  person Vortico    schedule 06.06.2011
comment
Ответы больше не действительны для Python 3.6 и более поздних версий, поскольку re теперь поддерживает встроенные группы модификаторов.   -  person Wiktor Stribiżew    schedule 12.11.2019


Ответы (2)


Модуль re не поддерживает флаги области действия, но есть альтернативная реализация регулярных выражений, которая:

http://pypi.python.org/pypi/regex

person MRAB    schedule 05.06.2011

Python не поддерживает отключение флагов таким же образом; вам придется обращаться с этим по-другому.

>>> re.match('[Ff][Oo]{2}bar', 'Foobar')
<_sre.SRE_Match object at 0x7eff94dac920>
person Ignacio Vazquez-Abrams    schedule 05.06.2011
comment
Я боялся этого решения, но оно может сработать. В приложении foo (часть, нечувствительная к регистру) будет заменена произвольной строкой, экранированной re.escape. Таким образом, мне нужно было бы программно расширить строку до '[' + s[i] + s[i].swapcase() + ']' .... Однако возможная пунктуация и другие небуквенно-цифровые символы могут создать проблему. - person Vortico; 06.06.2011