Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 31, 2010 10:23:34

st01en
От:
Зарегистрирован: 2010-09-14
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Как лучше распарсить строку с необязательными значениями

Есть строка типа “name#val1#val2”
где, name - обязательный параметр; val1 и val2 необязятельные параметры и имеют значение по умолчанию, заданое ранее; решетка - разделитель.
Т.е. может быть три варианта:

name
name#val1
name#val1#val2
как бы ее лучше распарсить? Сейчас у меня это сделано, на мой вгляд, довольно топорно:
str="name#val1#val2"
val1 = val2 = "default value"
if '#' in str:
lst=str.split('#')
name = lst[0]
val1 = lst[1]
if len(lst) == 3:
val2 = lst[2]
else:
name = str
Заранее спасибо



Офлайн

#2 Окт. 31, 2010 11:45:04

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Как лучше распарсить строку с необязательными значениями

def getname_val(a,a1="default value",a2="default value"): 
return a,a1,a2

s="name!#val1#12"
name,val1,val2 = getname_val(*s.split('#'))

print name,val1,val2
кто короче напишет ?



Офлайн

#3 Окт. 31, 2010 12:03:25

st01en
От:
Зарегистрирован: 2010-09-14
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Как лучше распарсить строку с необязательными значениями

ой-ой :)
что-то я не пойму как это работает. Вот та звездочка, что означает? А то даже не знаю какие доки искать :rolleyes:



Офлайн

#4 Окт. 31, 2010 12:22:46

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Как лучше распарсить строку с необязательными значениями

sp3
кто короче напишет ?
Я думаю многие. Вот не самый короткий пример:
name, val1, val2 = (s.split('#') + ["default value"]*2)[:3]



Отредактировано (Окт. 31, 2010 12:33:28)

Офлайн

#5 Окт. 31, 2010 14:04:36

st01en
От:
Зарегистрирован: 2010-09-14
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Как лучше распарсить строку с необязательными значениями

Ed
Я думаю многие. Вот не самый короткий пример:
Вот это я понял как работает. Красиво :)

И тут уже чисто из любопытства возник вопрос, а что если строку развернуть, т.е. например val1#val2#name, где name опять таки обязательный, остальные - опционально?



Офлайн

#6 Окт. 31, 2010 14:58:59

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Как лучше распарсить строку с необязательными значениями

st01en
а что если строку развернуть, т.е. например val1#val2#name
Например, так, для разнообразия:
name, val2, val1 = ("default value#"*2 + s).split('#')[-1:-4:-1]
PS: вообще-то это не разворот. Разворот будет так: val2#val1#name



Отредактировано (Окт. 31, 2010 15:01:26)

Офлайн

#7 Окт. 31, 2010 16:18:41

st01en
От:
Зарегистрирован: 2010-09-14
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Как лучше распарсить строку с необязательными значениями

Круто :)
Вот так все просто кажется когда увидел, почему ж самому такие мысли в голову не приходят? :)

Спасибо.



Офлайн

#8 Окт. 31, 2010 18:33:12

alexx11
От:
Зарегистрирован: 2010-05-13
Сообщения: 208
Репутация: +  0  -
Профиль   Отправить e-mail  

Как лучше распарсить строку с необязательными значениями

А руглярки не катят?

str="name#val1#val2"
print re.match(r"(?P<name>.*?)(?![^#])", str).group("name")



Офлайн

#9 Окт. 31, 2010 21:24:06

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Как лучше распарсить строку с необязательными значениями

alexx11
А руглярки не катят?
Ну почему же не катят. Только добавьте import re и удлинните регулярку для получения val1 и val2.



Офлайн

#10 Окт. 31, 2010 21:50:42

alexx11
От:
Зарегистрирован: 2010-05-13
Сообщения: 208
Репутация: +  0  -
Профиль   Отправить e-mail  

Как лучше распарсить строку с необязательными значениями

val1, val2 - ТС сказал вроде не надо ему.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version