Уведомления

Группа в Telegram: @pythonsu

#1 Май 1, 2010 06:34:59

avdoshkin
От:
Зарегистрирован: 2009-08-08
Сообщения: 93
Репутация: +  -1  -
Профиль   Отправить e-mail  

join and str

Всем, привет! Наткнулся на простой вопрос и что-то не то…
Есть данные:

auto vlan846
iface vlan846 inet static
address 10.8.46.251
netmask 255.255.255.0
vlan_raw_device eth0

auto vlan847
iface vlan847 inet static
address 10.8.47.251
netmask 255.255.255.0
vlan_raw_device eth0

auto vlan848
iface vlan848 inet static
address 10.8.48.251
netmask 255.255.255.0
vlan_raw_device eth0
из этих данных нужно получить результат:
iface vlan846 inet static  address 10.8.46.251 netmask 255.255.255.0
iface vlan847 inet static address 10.8.47.251 netmask 255.255.255.0
iface vlan848 inet static address 10.8.48.251 netmask 255.255.255.0
Есть вариант читаешь по одной строке. Если строка содержит auto, то читаешь еще 3 строки, из них split() выбрать нужные части и объединить в одну строку нужные части.
В общем результат у меня нулевой получается.



Офлайн

#2 Май 1, 2010 10:52:26

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

join and str

text.replace('\n\n','~').replace('\n',' ').replace('~','\n')

Офлайн

#3 Май 1, 2010 12:21:21

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

join and str

avdoshkin
В общем результат у меня нулевой получается.
Покажите код.



Офлайн

#4 Май 1, 2010 12:47:29

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

join and str

у меня посложнее, чем у o\d+, зато стойко к появлению ~

import re

s1 = """auto vlan846
iface vlan846 inet static
address 10.8.46.251
netmask 255.255.255.0
vlan_raw_device eth0

auto vlan847
iface vlan847 inet static
address 10.8.47.251
netmask 255.255.255.0
vlan_raw_device eth0

auto vlan848
iface vlan848 inet static
address 10.8.48.251
netmask 255.255.255.0
vlan_raw_device eth0"""

s2 = re.sub(r"auto vlan\d+\n|vlan_raw_device \w+(\n|$)", r"", s1)
s2 = re.sub(r"([^\n])\n", r"\1 ", s2)
print s2



Офлайн

#5 Май 1, 2010 13:15:42

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

join and str

pasaranax
у меня посложнее, чем у o\d+, зато стойко к появлению ~
угу. И в общем-то решает поставленную задачу, в отличие от первого варианта, который не выбрасывает лишние параметры.

А я сделал тупо, без регекспов, зато результат не зависит от порядка элементов в блоке исходных данных.
for block in text.split("\n\n"):
print "%(iface)s %(address)s %(netmask)s" % dict(((line.split()[0], line) \
for line in block.split('\n') if line))



Офлайн

#6 Май 1, 2010 13:56:30

avdoshkin
От:
Зарегистрирован: 2009-08-08
Сообщения: 93
Репутация: +  -1  -
Профиль   Отправить e-mail  

join and str

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

f = open('/root/interfaces','r').read()
for block in f.split('\n\n'):
print block.split()

Результат:




Офлайн

#7 Май 1, 2010 21:18:05

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

join and str

Это общий знаменатель чего? Внимательнее посмотрите мой код.



Офлайн

#8 Май 3, 2010 01:16:08

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

join and str

Вот так лучше:

s2 = [(block.split("\n")[1:4]) for block in s1.split("\n\n")]
Либо сразу вот так:
s2 = "\n".join(["".join(block.split("\n")[1:4]) for block in s1.split("\n\n")])



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version