На этом шаге мы продолжим изучать возможности модуля re.
Вы хотите найти в строке и заменить текст, соответствующий некоему шаблону.
Для простых литеральных шаблонов используйте метод str.replace(). Например:
>>> text = 'yeah, but no, but yeah, but no, but yeah' >>> text.replace('yeah', 'yep') 'yep, but no, but yep, but no, but yep' >>>
Для более сложных шаблонов используйте функции/методы sub() из модуля re. Предположим, вы хотите перезаписать даты, чтобы перевести из их формата "11/27/2012" в "2012-11-27". Вот пример того, как это можно сделать:
>>> text = 'Today is 11/27/2012. PyCon starts 3/13/2013.' >>> import re >>> re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text) 'Today is 2012-11-27. PyCon starts 2013-3-13.' >>>
Первый аргумент, передаваемый в sub(), - это шаблон для поиска, а второй - шаблон, которым нужно заменять найденное. Цифры, перед которыми поставлен обратный слеш, такие как \3, ссылаются на номера захватывающих групп в шаблоне.
Если вы собираетесь многократно выполнять подстановку по одному и тому же шаблону, рекомендуем скомпилировать его для увеличения производительности. Например:
>>> import re >>> datepat = re.compile(r'(\d+)/(\d+)/(\d+)') >>> datepat.sub(r'\3-\1-\2', text) 'Today is 2012-11-27. PyCon starts 2013-3-13.' >>>
В случае более сложных подстановок можно определить подстановочную функцию обратного вызова (callback). Например:
>>> from calendar import month_abbr >>> def change_date(m): mon_name = month_abbr[int(m.group(1))] return '{} {} {}'.format(m.group(2), mon_name, m.group(3)) >>> datepat.sub(change_date, text) 'Today is 27 Nov 2012. PyCon starts 13 Mar 2013.' >>>
На вход подстановочной функции обратного вызова в аргументе передается объект поиска совпадений, возвращенный функцией match() или find(). Используйте метод .group() для извлечения определенных частей совпадения. Функция должна возвращать измененный текст.
Если вы хотите знать, сколько подстановок было сделано в дополнение к получению измененного текста, используйте re.subn(). Например:
>>> newtext, n = datepat.subn(r'\3-\1-\2', text) >>> newtext 'Today is 2012-11-27. PyCon starts 2013-3-13.' >>> n 2 >>>
В поиске совпадений с помощью регулярных выражений не особо много чего-то еще, помимо показанного примера с использованием метода sub(). Самое сложное - это составление шаблонов регулярных выражений, и мы оставляем это вам в качестве упражнений.
На следующем шаге мы рассмотрим поиск и замену текста без учета регистра.