Форум сайта python.su
Привет.
Пытаюсь распарсить файлик с логами, столкнулся с небольшой проблемой: как заставить парсить данные только между определенными подстроками? Поясню на примере.
Файл выглядит примерно так:
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 удовлетворяющие условиям, то ли пары. Если же всё таки пары, то в исходном тексте какая закономерность их расположения: из примера видно что вперемешку, а может ли быть такое что например идут 3 name а потом 3 status.
Офлайн
В идеале хотел бы получить
[,
,
,
]
Офлайн
вопрос в другом, недостаточно информации об исходных данных.
status="
name=asd, status=up
status=down, name=yye
name=dfg, status=up
name=khj, status=down
"
Офлайн
Для выделения блока со статусами воспользуйтесь регулярным выражением:
>>> 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']
>>>
Офлайн
alexx11А, в это смысле. В каждой строке может быть не больше одного name или status. Ну то есть варианта
вопрос в другом, недостаточно информации об исходных данных.Здесь в примере я вижу name status name name status name status. Остаётся домысливать как они могут располагаться, что может привести к ошибки. Проще более точно описать задачу.status="
name=asd, status=up
status=down, name=yye
name=dfg, status=up
name=khj, status=down
"
Офлайн
В таком случаее я бы пошёл по пути как описал 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', '', '')]
Офлайн