Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 12, 2010 10:48:08

sprite
От:
Зарегистрирован: 2010-04-12
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

вырезание строки

Добрый день.

Я опрашиваю коммутатор по телнету и получаю большую строку, которую могу поделить на строки и получить список строк. Критерием деления является 2 символа \n\r и split('\n\r') замечательно делит мне строки. Но в некоторых случаях коммутатором выдается строка начинающаяся с ескейп-последовательности \x1b и содержащая ее несколько раз. Как мне вырезать всю это строку? Подскажите пож-ста!



Офлайн

#2 Апрель 12, 2010 11:06:25

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

вырезание строки

lstrip('\x1b')



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Апрель 12, 2010 12:35:45

sprite
От:
Зарегистрирован: 2010-04-12
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

вырезание строки

PooH
lstrip('\x1b')
Неподходит, мне не символ в начале строки вырезать надо, а всю строку от символа \x1b до символов \n\r. Причем символов \x1b в этой строке может быть несколько.
Может я несовсем правильно объяснил ситуацию. У меня есть переменная string, очень большая, она содержит текст состоящий из форматированных строк, с признаком конца \n\r. Методом split я могу поделить эту строку на список строк, и дальше обрабатывать элементы этого массива как обычные строки. Но так-как в моей первоначальной строке содержится текст с эскейп последовательностями, полученный таким образом массив строк обрабатывается некорректно. Мне надо либо выкинуть эту строку из массива, как элемент списка, либо из первоначальной строки удалить текст форматированной строки содержащий символы эскейп последовательности (все что я о нем знаю, этот фрагмент текста начинается на \x1b и заканчивается на \n\r) и потом уже пользовать метод split. Как это сделать не могу придумать.



Офлайн

#4 Апрель 12, 2010 12:56:10

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

вырезание строки

sprite
PooH
lstrip('\x1b')
Неподходит, мне не символ в начале строки вырезать надо, а всю строку от символа \x1b до символов \n\r. Причем символов \x1b в этой строке может быть несколько.
Может я несовсем правильно объяснил ситуацию. У меня есть переменная string, очень большая, она содержит текст состоящий из форматированных строк, с признаком конца \n\r. Методом split я могу поделить эту строку на список строк, и дальше обрабатывать элементы этого массива как обычные строки. Но так-как в моей первоначальной строке содержится текст с эскейп последовательностями, полученный таким образом массив строк обрабатывается некорректно. Мне надо либо выкинуть эту строку из массива, как элемент списка, либо из первоначальной строки удалить текст форматированной строки содержащий символы эскейп последовательности (все что я о нем знаю, этот фрагмент текста начинается на \x1b и заканчивается на \n\r) и потом уже пользовать метод split. Как это сделать не могу придумать.
[i for i in string.split('\n\r') if '\x1b' not in i]



Офлайн

#5 Апрель 12, 2010 14:12:21

sprite
От:
Зарегистрирован: 2010-04-12
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

вырезание строки

Syao
[i for i in string.split('\n\r') if '\x1b' not in i]
Решил проблему проще strOut = re.sub(r“\x1b.*\n\r”, r'', strOut)



Офлайн

#6 Апрель 14, 2010 02:20:14

denz
От:
Зарегистрирован: 2007-01-09
Сообщения: 117
Репутация: +  0  -
Профиль   Отправить e-mail  

вырезание строки

sprite
Решил проблему проще strOut = re.sub(r“\x1b.*\n\r”, r'', strOut)
а почему просто не
[s.strip() for s in strOut.replace(chr(27), '').split('\r\n')]
побыстрее чем регекспами будет …



Отредактировано (Апрель 14, 2010 02:21:50)

Офлайн

#7 Апрель 14, 2010 09:51:31

sprite
От:
Зарегистрирован: 2010-04-12
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

вырезание строки

denz
sprite
Решил проблему проще strOut = re.sub(r“\x1b.*\n\r”, r'', strOut)
а почему просто не
[s.strip() for s in strOut.replace(chr(27), '').split('\r\n')]
побыстрее чем регекспами будет …
Может и быстрее, попробую ваш рецепт обязательно. НО в моем случает не просто символ нужно выреазть, а всю строку в которой он содержится.
Спасибо за совет.



Офлайн

#8 Апрель 15, 2010 14:31:25

pochechyev
От:
Зарегистрирован: 2008-02-29
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

вырезание строки

самый просто вариант (в лоб)

for my_str in str_list: 
if "\x1b" in my_str:
str_list.remove(my_str)
str_list - список строк который вы полчили парсингом “большой строки” с коммутатора

так будет быстрее:

for i in xrange(len(str_list)): 
if "\x1b" in str_list(i):
str_list.pop(i)



Отредактировано (Апрель 15, 2010 14:39:12)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version