Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 27, 2011 13:13:20

Bazzilio
От:
Зарегистрирован: 2011-04-27
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

re.match

Здраствуйте товарищи!

Подскажите пожалуйста есть ли элегантное решение, задача такая:

есть список вида
a = {“aaa”: “a”, “bbb”: “b”, “ccc”: “c”}

и есть срока типа
str = “qqwwweirweru-aaa-qwoeiopqwepw”

можно ли как то сравнить с помощью re.match(<элемент из списка (напр. “aaa”)>, str) сразу весь список? или может есть другой метод? или надо тупо перебирать кадый раз список построчно и сравнивать строку?

в итоге если в str найдено совпадеине с одним из элементов списка например “ааа”, то возвращаем “а”



Офлайн

#2 Апрель 27, 2011 14:00:50

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

re.match

А чем перебор не устраивает? Можно вот так извратиться:

a = {"aaa": "a", "bbb": "b", "ccc": "c"}
s = "qqwwweirweru-aaa-qwoeiopqwepw"
matches = map(lambda x: re.match('.*%s.*'%x,s),sorted(a.keys()))
map(lambda x,y: a[y] if x is not None else None, matches, sorted(a.keys()))



Офлайн

#3 Апрель 27, 2011 14:14:37

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

re.match

Можно из списка сделать рег. выражение вида “aaa|bbb|ccc”

a = {"aaa": "a", "bbb": "b", "ccc": "c"}
s = "qqwwweirweru-aaa-qwoeiopqwepw"
r = re.search( "|".join( a.keys() ), s )
if r is None:
print "NotFound"
else:
print a[ r.group(0) ]



Офлайн

#4 Апрель 27, 2011 14:15:52

Bazzilio
От:
Зарегистрирован: 2011-04-27
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

re.match

Vader
А чем перебор не устраивает? Можно вот так извратиться:
a = {"aaa": "a", "bbb": "b", "ccc": "c"}
s = "qqwwweirweru-aaa-qwoeiopqwepw"
matches = map(lambda x: re.match('.*%s.*'%x,s),sorted(a.keys()))
map(lambda x,y: a[y] if x is not None else None, matches, sorted(a.keys()))
спасибо!

перебор тоже работает, просто мне кажется это наверно самый медленный и неэффективный способ, поэтому подумал может есть какой то еще способ, тем более у питона вроде полно всяких функций для работы со списками.



Офлайн

#5 Апрель 27, 2011 14:47:02

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

re.match

Вы бы проверили сначала, что быстрее. У меня, например, на вашем примере перебор работает в 2 раза быстрее, чем тот код, который я написал выше.



Отредактировано (Апрель 27, 2011 14:47:25)

Офлайн

#6 Апрель 27, 2011 14:56:34

Bazzilio
От:
Зарегистрирован: 2011-04-27
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

re.match

ок, попробую, спс за помощь, ваш вариант для меня еще темный лес, я только учусь.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version