Найти - Пользователи
Полная версия: Как разбить строку?
Начало » Python для новичков » Как разбить строку?
1 2
Seganapa
str = "Запчасти кузова | -Детали кузова / крыло / буфер | --Продольная / поперечная балка | --Колесная ниша | --Накладки порога / двери | ---Боковина | --Крыло / навесные части | --Обшивка кузова | -Крышки багажника / капоты / двери / складная крыша |
"

Количество черточек перед словом означает уровень вложенности.
Возможно ли разбить строку таким образом, чтобы на выходе получить

Запчасти кузова | -Детали кузова / крыло / буфер | –Продольная / поперечная балка |
Запчасти кузова | -Детали кузова / крыло / буфер | –Колесная ниша |
Запчасти кузова | -Детали кузова / крыло / буфер | –Накладки порога / двери | —Боковина |
Запчасти кузова | -Детали кузова / крыло / буфер | –Крыло / навесные части |
Запчасти кузова | -Детали кузова / крыло / буфер | –Обшивка кузова |
Запчасти кузова | -Крышки багажника / капоты / двери / складная крыша |

Понимаю что для начало нужно разбить строку split, а дальше что?
FishHook
Откуда такой формат данных берётся?
terabayt
как-то так
# -*- coding: utf-8 -*-
def f(s):
    a = s[:-1].split('|')
    for i in xrange(0, len(a)*2, 2):
        a.insert(i+1, 0)
        for j in a[i][1:]:
            if j == '-':
	        a[i+1] += 1
	    else:
	        break
    s_out = ""
    if len(a) < 4:
        return s
    for i in xrange(3, len(a), 2):
        if a[i] <= a[i-2]:
	    index = a[i]-1
	    s_tmp = a[i-1]
	    for j in xrange(i-2, 0, -2):
		if a[j] == index:
	            s_tmp = a[j-1] + s_tmp
		    index -= 1
	    s_out += s_tmp + "\n"
    return s_out
s_in = r"Запчасти кузова | -Детали кузова / крыло / буфер | --Продольная / поперечная балка | --Колесная ниша | --Накладки порога / двери | ---Боковина | --Крыло / навесные части | --Обшивка кузова | -Крышки багажника / капоты / двери / складная крыша |"
print f(s_in)
Запчасти кузова  -Детали кузова / крыло / буфер  --Колесная ниша 
Запчасти кузова  -Детали кузова / крыло / буфер  --Накладки порога / двери 
Запчасти кузова  -Детали кузова / крыло / буфер  --Крыло / навесные части 
Запчасти кузова  -Детали кузова / крыло / буфер  --Обшивка кузова 
Запчасти кузова  -Крышки багажника / капоты / двери / складная крыша 
Budulianin
s = s.strip(' |').split(' | ')
def print_line(result):
    print(' | '.join(result[k] for k in sorted(result)) + ' |')
result = {}
for elem in s:
    number_dash = elem.count('-')
    if number_dash in result:
        print_line(result)
        result[number_dash] = elem
        if number_dash + 1 in result:
            del result[number_dash + 1]
    else:
        result[number_dash] = elem
else:
    print_line(result)
terabayt
Budulianin
s = r"Запчасти кузова - комплектующие | -Детали кузова / крыло / буфер | --Продольная / поперечная балка | --Колесная ниша | --Накладки порога / двери | ---Боковина | --Крыло / навесные части | --Обшивка кузова | -Крышки багажника / капоты / двери / складная крыша |"
Запчасти кузова - комплектующие |
-Детали кузова / крыло / буфер | --Продольная / поперечная балка |
-Детали кузова / крыло / буфер | --Колесная ниша |
-Детали кузова / крыло / буфер | --Накладки порога / двери | ---Боковина |
-Детали кузова / крыло / буфер | --Крыло / навесные части |
-Детали кузова / крыло / буфер | --Обшивка кузова |
-Крышки багажника / капоты / двери / складная крыша |
или
s = r"Запчасти кузова | -Детали кузова / крыло / буфер | --Продольно-поперечная балка | --Колесная ниша | --Накладки порога / двери | ---Боковина | --Крыло / навесные части | --Обшивка кузова | -Крышки багажника / капоты / двери / складная крыша |"
Запчасти кузова | -Детали кузова / крыло / буфер | --Колесная ниша | --Продольно-поперечная балка |
Запчасти кузова | -Детали кузова / крыло / буфер | --Накладки порога / двери | ---Боковина |
Запчасти кузова | -Детали кузова / крыло / буфер | --Крыло / навесные части |
Запчасти кузова | -Детали кузова / крыло / буфер | --Обшивка кузова |
Запчасти кузова | -Крышки багажника / капоты / двери / складная крыша |
Budulianin
terabayt
Хе, ну принимай патч тогда.

def print_line(result):
    print(' | '.join(result[k] for k in sorted(result)) + ' |')
result = {}
for elem in s:
    match = re.match('(-+)[а-яА-Я0-9]+', elem)
    number_dash = match and len(match.group(1)) or 0
    if number_dash in result:
        print_line(result)
        result[number_dash] = elem
        if number_dash + 1 in result:
            del result[number_dash + 1]
    else:
        result[number_dash] = elem
else:
    print_line(result)
Seganapa
terabayt
Второй вариант

Ваш код работает, но почему-то теряются некоторые элементы
Например из такой строки
s_in = r"Запчасти кузова | -Детали кузова / крыло / буфер | --Продольная / поперечная балка | --Колесная ниша | --Накладки порога / двери | --Боковина | --Крыло / навесные части | --Обшивка кузова | -Крышки багажника / капоты / двери / складная крыша | --Двери / составляющие | -Дополнительная фара / комплектующие | --Противотуманная фара / комплектующие | ---Противотуманная фара лампа накаливания | --Фара дальнего света / комплектующие | ---Лампа накаливания фара дальнего света | -Система освещения / световые приборы | --Габаритный огонь / комплектующие | ---Лампа накаливания | --Фонарь стоп-сигнала / комплектующие | ---Лампа накаливания | --Фонарь указателя поворота / комплектующие | ---Лампа накаливания | --Фонарь освещения номерного знака / комплектующие | ---Лампа накаливания | --Задняя противотуманная фара / комплектующие | ---Лампа накаливания | --Фара заднего хода / комплектующие | ---Лампа накаливания | --Фонарь, установленный в двери | -Основная фара / комплектующие | --Лампа накаливания основной фары | -Запчасти передней части кузова | --Основная фара / комплектующие | ---Лампа накаливания основной фары | --Противотуманная фара / комплектующие | ---Противотуманная фара лампа накаливания | --Фара дальнего света / комплектующие | ---Лампа накаливания фара дальнего света | --Фонарь указателя поворота / комплектующие | ---Лампа накаливания | --Детали крепления | ---Упругие элементы | --Колесная ниша | -Кабина пассажира | --Накладки порога / двери | --Двери / составляющие | --Боковина | --Топливный бак | -Запчасти задней части кузова | --Габаритный огонь / комплектующие | ---Лампа накаливания | --Фонарь стоп-сигнала / комплектующие | ---Лампа накаливания | --Фонарь указателя поворота / комплектующие | ---Лампа накаливания | --Фонарь освещения номерного знака / комплектующие | ---Лампа накаливания | --Задняя противотуманная фара / комплектующие | ---Лампа накаливания | --Фара заднего хода / комплектующие | ---Лампа накаливания | --Облицовка | --Колесная ниша | --Топливный бак | --Крыло / навесные части | --Боковина | --Задняя дверь / детали | -Топливный бак | -Упругие элементы"

Пропадает "–Продольная / поперечная балка"
Seganapa
Проблема остается актуальной!

Может я изначально что-то не так делаю. (как раз к вопросу
Откуда такой формат данных берётся?
)

Предыстория ))

Имеется множество похожих списков (с иерархией)

СПИСОК 1:
Запчасти кузова
  -Детали кузова перед / крыло / буфер
    --Продольная / поперечная балка
    --Колесная ниша
    --Накладки порога / двери
  -Крышки багажника / капоты / двери / складная крыша
    --Двери / составляющие
      ---Ручка двери
Запчасти двигателя
  -Газораспределительный механизм
    --Ремень ГРМ / натяжение ремня
      ---Ремень ГРМ
      ---Комплект ремней ГРМ
    --Цепь привода распредвала / натяжение
      ---Планка успокоителя


СПИСОК 2:
Запчасти кузова
  -Детали кузова перед / крыло / буфер
    --Колесная ниша
  -Детали кузова зад / крыло / буфер
    --Колесная ниша
  -Крышки багажника / капоты / двери / складная крыша
    --Двери / составляющие
      ---Стекло двери
    --Крыша / составляющие
      ---Стекло двери
Запчасти двигателя
-Газораспределительный механизм
–Ремень ГРМ / натяжение ремня
—Ремень ГРМ
—Комплект ремней ГРМ
–Цепь привода распредвала / натяжение
—Планка успокоителя

И т.д.
Списков очень много, они похожи НО уровень вложенности и некоторые пункты могут отличатся.
На выходе мне нужно получить один ОБЩИЙ список всех пунктов, и при этом соблюсти вложенность.

на выходе должно получится:
Запчасти кузова
  -Детали кузова / крыло / буфер
    --Продольная / поперечная балка
    --Колесная ниша
    --Накладки порога / двери
  -Детали кузова зад / крыло / буфер
    --Колесная ниша
  -Крышки багажника / капоты / двери / складная крыша
    --Двери / составляющие
      ---Ручка двери
      ---Стекло двери
    --Крыша / составляющие
      ---Стекло двери
Запчасти двигателя
  -Газораспределительный механизм
    --Ремень ГРМ / натяжение ремня
      ---Ремень ГРМ
      ---Комплект ремней ГРМ
    --Цепь привода распредвала / натяжение
      ---Планка успокоителя

Посоветуйте правильный алгоритм, пожалуйста. К какому виду может привести эти списки, чтобы было удобнее с ними работать и исключить ошибки…
py.user.next
1) Оформи их в теги кода, чтобы дефисы не сливались.
2) Приведи входные списки и выходной список.
Seganapa
py.user.next
1) Оформи их в теги кода, чтобы дефисы не сливались.2) Приведи входные списки и выходной список.
поправил.
Не знаю если поможет, в общем мне нужно спарсить множество списков (ul li) и объединить их в один, сохранив при этом иерархию и все пункты… Как-то так.
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