Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 1, 2010 12:57:52

yegorov-p
От:
Зарегистрирован: 2009-10-11
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг данных строго между двумя подстроками

Привет.
Пытаюсь распарсить файлик с логами, столкнулся с небольшой проблемой: как заставить парсить данные только между определенными подстроками? Поясню на примере.
Файл выглядит примерно так:

name=rtu, status=up
name=yui, status=down

status="
name=asd, status=up
status=down, name=yye
name=dfg, status=up
name=khj, status=down
"
требуется получить значения name и status, но только те, что содержатся между status=“ и ”
Если парсить нечто вроде
name=(\S*), status=(\S*)
то предсказуемо парсится вообще все.



Офлайн

#2 Ноя. 1, 2010 13:55:37

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

Парсинг данных строго между двумя подстроками

не совсем понятно что хочет ТС: толи нужны все name и status удовлетворяющие условиям, то ли пары. Если же всё таки пары, то в исходном тексте какая закономерность их расположения: из примера видно что вперемешку, а может ли быть такое что например идут 3 name а потом 3 status.



Офлайн

#3 Ноя. 1, 2010 15:15:39

yegorov-p
От:
Зарегистрирован: 2009-10-11
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг данных строго между двумя подстроками

В идеале хотел бы получить
[,
,
,
]



Офлайн

#4 Ноя. 1, 2010 15:23:08

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

Парсинг данных строго между двумя подстроками

вопрос в другом, недостаточно информации об исходных данных.

status="
name=asd, status=up
status=down, name=yye
name=dfg, status=up
name=khj, status=down
"
Здесь в примере я вижу name status name name status name status. Остаётся домысливать как они могут располагаться, что может привести к ошибки. Проще более точно описать задачу.



Офлайн

#5 Ноя. 1, 2010 15:25:49

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Парсинг данных строго между двумя подстроками

Для выделения блока со статусами воспользуйтесь регулярным выражением:

>>> x = """name=rtu, status=up
... name=yui, status=down
...
... status="
... name=asd, status=up
... status=down, name=yye
... name=dfg, status=up
... name=khj, status=down
... " """
>>> import re
>>> re.findall('status=".*"',x,flags=re.DOTALL)[0]
'status="\nname=asd, status=up\nstatus=down, name=yye\nname=dfg, status=up\nname
=khj, status=down\n"'
Получите нужный блок. Выделите только нужные строки. Например, в этом случае:
>>> result = re.findall('status=".*"',x,flags=re.DOTALL)[0].split('\n')[1:-1]
>>> print result
['name=asd, status=up', 'status=down, name=yye', 'name=dfg, status=up', 'name=kh
j, status=down']
>>>
Дальше, думаю, разберетесь…



Офлайн

#6 Ноя. 2, 2010 13:29:58

yegorov-p
От:
Зарегистрирован: 2009-10-11
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг данных строго между двумя подстроками

alexx11
вопрос в другом, недостаточно информации об исходных данных.
status="
name=asd, status=up
status=down, name=yye
name=dfg, status=up
name=khj, status=down
"
Здесь в примере я вижу name status name name status name status. Остаётся домысливать как они могут располагаться, что может привести к ошибки. Проще более точно описать задачу.
А, в это смысле. В каждой строке может быть не больше одного name или status. Ну то есть варианта
name=asd, name=fsfsdlj, status=up
быть не может. Опять же, может быть только name или только status
Порядок может быть произвольный, то есть name может стоять как в начале, так и в конце.



Офлайн

#7 Ноя. 2, 2010 15:50:07

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

Парсинг данных строго между двумя подстроками

В таком случаее я бы пошёл по пути как описал regall, но если же сплит по строкам не устраивает, то можно данные полученные в двойных кавычках скормить:

result = '''name=asd, status=up
status=down, name=yye
name=dfg, status=up
name=khj, status=down
name=nnn,
status=sss
'''
print re.findall("(\w+)=(\w+).*?(?:(\w+)(?:=)(\w+).*?\n|\n)", result, re.S)
[('name', 'asd', 'status', 'up'), ('status', 'down', 'name', 'yye'), ('name', 'dfg', 'status', 'up'), ('name', 'khj', 'status', 'down'), ('name', 'nnn', '', ''), ('status', 'sss', '', '')]
При желании можно уже словарик сделать.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version