Python String зачистки и расщепления - PullRequest
1 голос
/ 11 августа 2011

Я работаю с метаданными изображения и могу извлечь строку, похожую на эту

Cube1[visible:true, mode:Normal]{r:Cube1.R, g:Cube1.G, b:Cube1.B, a:Cube1.A},
Ground[visible:true, mode:Normal]{r:Ground.R, g:Ground.G, b:Ground.B, a:Ground.A},
Cube3[visible:true, mode:Normal]{r:Cube3.R, g:Cube3.G, b:Cube3.B, a:Cube3.A},
Cube4[visible:true, mode:Normal]{r:Cube4.R, g:Cube4.G, b:Cube4.B, a:Cube4.A},
Sphere[visible:true, mode:Normal]{r:Sphere.R, g:Sphere.G, b:Sphere.B, a:Sphere.A},
OilTank[visible:true, mode:Normal]{r:OilTank.R, g:OilTank.G, b:OilTank.B, a:OilTank.A},
Cube2[visible:true, mode:Normal]{r:Cube2.R, g:Cube2.G, b:Cube2.B, a:Cube2.A}

, которая преобразует этот большой беспорядок только в имена слоев.Мне также нужно, чтобы порядок остался прежним.Итак, в этом случае это будет:

Cube1
Ground
Cube3
Cube4
Sphere
OilTank
Cube2

Я пробовал использовать «split» и «slice».Я предполагаю, что здесь есть иерархия, но я не уверен, куда идти дальше.

Ответы [ 6 ]

1 голос
/ 11 августа 2011
>>> mess = 'Cube1[visible:true, mode:Normal]{r:Cube1.R, g:Cube1.G, b:Cube1.B, a:Cube1.A},\nGround[visible:true, mode:Normal]{r:Ground.R, g:Ground.G, b:Ground.B, a:Ground.A},\nCube3[visible:true, mode:Normal]{r:Cube3.R, g:Cube3.G, b:Cube3.B, a:Cube3.A},\nCube4[visible:true, mode:Normal]{r:Cube4.R, g:Cube4.G, b:Cube4.B, a:Cube4.A},\nSphere[visible:true, mode:Normal]{r:Sphere.R, g:Sphere.G, b:Sphere.B, a:Sphere.A},\nOilTank[visible:true, mode:Normal]{r:OilTank.R, g:OilTank.G, b:OilTank.B, a:OilTank.A},\nCube2[visible:true, mode:Normal]{r:Cube2.R, g:Cube2.G, b:Cube2.B, a:Cube2.A}'
>>> names = "\n".join(line.split("[", 1)[0] for line in mess.split("\n"))
>>> print names
Cube1
Ground
Cube3
Cube4
Sphere
OilTank
Cube2
1 голос
/ 11 августа 2011

Если вам просто нужна самая левая часть, я бы использовал:

name, _ = line.split("[", 1)

Если вам нужно что-то более сложное, я бы рассмотрел использование регулярных выражений с модулем re ... Позвольте мнезнаю, и я могу что-то предложить.

1 голос
/ 11 августа 2011

Если данные действительно отформатированы так:

    import re
    i = [the listed string] 
    names = [j.strip('[') for j in re.findall("\w+\[\.*", i)]

Вывод:

['Cube1', 'Ground', 'Cube3', 'Cube4', 'Sphere', 'OilTank', 'Cube2']
0 голосов
/ 11 августа 2011

С разделением строки:

names = [ x.split('[')[0] for x in your_text.split('\n') ]

С регулярными выражениями:

import re
names = re.findall(r'^\w+', your_text, re.MULTILINE)
0 голосов
/ 11 августа 2011

Регулярные выражения не нужны, при условии, что это действительно точный формат ваших данных.

[i.split('[', 1)[0] for i in lst]
0 голосов
/ 11 августа 2011

Я не знаю много о питоне, но мои мысли с точки зрения логики были бы таковы:

  1. Разделить запятую
  2. Цикл полученного массиваобрезать все после первого '[', используя подстроку (indexOf) или аналогичные манипуляции с питоном.
  3. Затем снова циклически обработать массив для объединения строк обратно.не знаю конкретных команд для этого.Надеюсь, это поможет!
...