Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 26, 2012 05:13:07

anemak
От:
Зарегистрирован: 2012-01-23
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения и вывод результатов

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+”.



Отредактировано (Янв. 26, 2012 05:14:07)

Офлайн

#2 Янв. 26, 2012 07:42:39

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

Регулярные выражения и вывод результатов

1. Это явно не юникод, а windows-1251. При печати производится преобразование объекта в строку. Для tuple это аналогично вызову repr.
2. Прочитай про re.LOCALE и re.UNICODE

И еще - не называй переменную str, т.к. это скрывает встроенный тип.



Офлайн

#3 Янв. 26, 2012 10:06:00

anemak
От:
Зарегистрирован: 2012-01-23
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения и вывод результатов

1. Справедливо…
2. Читал, сделал - не вышло, направление понял, спасибо.

Все переменные для примера, для лучшего понимания примера … Вообще я всегда делаю рефакторинг после написания кода.



Офлайн

#4 Янв. 26, 2012 12:36:30

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

Регулярные выражения и вывод результатов

# -*- 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() )



Офлайн

#5 Янв. 26, 2012 13:12:41

anemak
От:
Зарегистрирован: 2012-01-23
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения и вывод результатов

agalen
u"Ипоте…
Думаю ставить это везде - лишнее, достаточно добавить re.U в регулярное выражение, чтобы \w соответствовало нашим символам.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version