Найти - Пользователи
Полная версия: Регулярные выражения и вывод результатов
Начало » Python для новичков » Регулярные выражения и вывод результатов
1
anemak
Windows, Python 2.7

Код:
# -*- coding: windows-1251 -*-
import re

str = "Ипотека Тольятти. Автовазбанк."
regex = re.compile("Ипотека\s+(?P<city>[-А-яё\s]+)\.\s+(?P<bank>[-А-яё\s]+)\.", re.I)
match = regex.search(str)
print "Один элемент:", match.group("city")
print "Несколько элементов:", match.group("city", "bank")
print "Все элементы:", match.groups()
Результат
Один элемент: Тольятти
Несколько элементов: ('\xd2\xee\xeb\xfc\xff\xf2\xf2\xe8', '\xc0\xe2\xf2\xee\xe2\xe0\xe7\xe1\xe0\xed\xea')
Все элементы: ('\xd2\xee\xeb\xfc\xff\xf2\xf2\xe8', '\xc0\xe2\xf2\xee\xe2\xe0\xe7\xe1\xe0\xed\xea')
1. Почему список выводится в юникоде?
2. “\w+” - эквивалентен +, но не +. Использовал сначала + для поиска русских слов, но почему то не включается в интервал символ “ё” … пришлось дописать до +.

Сторонние модули пожалуйста не предлагайте. Хочется понять механизм преобразований, откуда взялся юникод, и почему не работают списки русских символов и “\w+”.
agalen
1. Это явно не юникод, а windows-1251. При печати производится преобразование объекта в строку. Для tuple это аналогично вызову repr.
2. Прочитай про re.LOCALE и re.UNICODE

И еще - не называй переменную str, т.к. это скрывает встроенный тип.
anemak
1. Справедливо…
2. Читал, сделал - не вышло, направление понял, спасибо.

Все переменные для примера, для лучшего понимания примера … Вообще я всегда делаю рефакторинг после написания кода.
agalen
# -*- coding: windows-1251 -*-
import re

line = u"Ипотека Тольятти. Автовазбанк."
regex = re.compile( ur"Ипотека\s+(?P<city>[\w\s]+)\.\s+(?P<bank>[\w\s]+)\.", re.I | re.UNICODE )
match = regex.search(line)
print u"Один элемент:", match.group("city")
print u"Несколько элементов:", u", ".join( match.group("city", "bank") )
print u"Все элементы:", u", ".join( match.groups() )
anemak
agalen
u"Ипоте…
Думаю ставить это везде - лишнее, достаточно добавить re.U в регулярное выражение, чтобы \w соответствовало нашим символам.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB