Найти - Пользователи
Полная версия: join and str
Начало » Python для новичков » join and str
1
avdoshkin
Всем, привет! Наткнулся на простой вопрос и что-то не то…
Есть данные:
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() выбрать нужные части и объединить в одну строку нужные части.
В общем результат у меня нулевой получается.
o7412369815963
text.replace('\n\n','~').replace('\n',' ').replace('~','\n')
Ed
avdoshkin
В общем результат у меня нулевой получается.
Покажите код.
pasaranax
у меня посложнее, чем у 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
Ed
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))
avdoshkin
Всем кто ответивший на мой вопрос спасибо! Прочитал все ваши ответы и подвел к общему знаменателю.

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

Результат:


Ed
Это общий знаменатель чего? Внимательнее посмотрите мой код.
pasaranax
Вот так лучше:
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")])
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB