Шаг 28.
Python: сборник рецептов.
Строки и текст. Поиск и замена текста без учета регистра

    На этом шаге мы рассмотрим использование флага re.IGNORECASE.

Задача

    Вам необходимо найти и, возможно, заменить текст, не обращая внимания на регистр букв.

Решение

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

>>> text = 'UPPER PYTHON, lower python, Mixed Python'
>>> re.findall('python', text, flags=re.IGNORECASE)
['PYTHON', 'python', 'Python']
>>> re.sub('python', 'snake', text, flags=re.IGNORECASE)
'UPPER snake, lower snake, Mixed snake'
>>>

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

>>> def matchcase(word):
	def replace(m):
		text = m.group()
		if text.isupper():
			return word.upper()
		elif text.islower():
			return word.lower()
		elif text[0].isupper():
			return word.capitalize()
		else:
			return word
	return replace

    А вот пример использования этой функции:

>>> re.sub('python', matchcase('snake'), text, flags=re.IGNORECASE)
'UPPER SNAKE, lower snake, Mixed Snake'
>>> 


Обсуждение

    В случаях простого применения re.INGNORECASE достаточно для поиска совпадений без учета регистра. Однако обратите внимание, что этого может оказаться недостаточно для некоторых случаев работы с Unicode, использующих выравнивание регистров (case folding).

    На следующем шаге мы рассмотрим определение регулярных выражений для поиска кратчайшего совпадения.




Предыдущий шаг Содержание Следующий шаг