Разбор списков TCL в Python - PullRequest
4 голосов
/ 25 февраля 2012

Мне нужно разделить разделенные пробелами списки TCL на двойных скобках ... например ...

OUTPUT = """{{172.25.50.10:01:01-Ethernet 172.25.50.10:01:02-Ethernet {Traffic Item 1}}} {{172.25.50.10:01:02-Ethernet 172.25.50.10:01:01-Ethernet {Traffic Item 1}}}"""

Это должно разобрать на ...

OUTPUT = ["""{{172.25.50.10:01:01-Ethernet 172.25.50.10:01:02-Ethernet {Traffic Item 1}}}""", 
    """{{172.25.50.10:01:02-Ethernet 172.25.50.10:01:01-Ethernet {Traffic Item 1}}}"""]

У меняпробовал ...

import re
splitter = re.compile('}}\s+{{')
splitter.split(OUTPUT)

Тем не менее, это сокращает скобки в центре ...

['{{172.25.50.10:01:01-Ethernet 172.25.50.10:01:02-Ethernet {Traffic Item 1}',
'172.25.50.10:01:02-Ethernet 172.25.50.10:01:01-Ethernet {Traffic Item 1}}}']

Я не могу понять, как разделить только пробелы между }} {{.Я знаю, что могу обманывать и вставлять пропущенные фигурные скобки вручную, но я бы предпочел найти простой способ эффективно разобрать это.framework) для произвольного числа разделенных пробелами строк, содержащих {{content here}}?

Ответы [ 3 ]

4 голосов
/ 25 февраля 2012

Pyparsing улучшился после обсуждения comp.lang.python, и я думаю, что даже Кэмерон Лэйрд не будет жаловаться на решение, использующее метод nestedExpr pyparsing:

OUTPUT = """{{172.25.50.10:01:01-Ethernet 172.25.50.10:01:02-Ethernet {Traffic Item 1}}} {{172.25.50.10:01:02-Ethernet 172.25.50.10:01:01-Ethernet {Traffic "Item 1"}}}"""

from pyparsing import nestedExpr, originalTextFor

nestedBraces1 = nestedExpr('{', '}')
for nb in nestedBraces1.searchString(OUTPUT):
    print nb

nestedBraces2 = originalTextFor(nestedExpr('{', '}'))
for nb in nestedBraces2.searchString(OUTPUT):
    print nb

Печать:

[[['172.25.50.10:01:01-Ethernet', '172.25.50.10:01:02-Ethernet', ['Traffic', 'Item', '1']]]]
[[['172.25.50.10:01:02-Ethernet', '172.25.50.10:01:01-Ethernet', ['Traffic', '"Item 1"']]]]
['{{172.25.50.10:01:01-Ethernet 172.25.50.10:01:02-Ethernet {Traffic Item 1}}}']
['{{172.25.50.10:01:02-Ethernet 172.25.50.10:01:01-Ethernet {Traffic "Item 1"}}}']

Если вам нужно будет повторно разделить данные, чтобы получить отдельные элементы из вложенных фигурных скобок, то исходный вложенный список, выведенный из nestedExpr, может быть лучше цитируемый элемент сохраняется как отдельный элемент). Но если вы действительно хотите эту строку, содержащую вложенные фигурные скобки, тогда используйте форму с originalTextFor, показанную в nestedBraces2.

3 голосов
/ 25 февраля 2012

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

re.compile('(?<=}})\s+(?={{)')
1 голос
/ 25 февраля 2012

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

re.findall(r'({{.*?}})(?:\Z|\s+)', OUTPUT)

Например:

In [30]: regex = re.compile(r'({{.*?}})(?:\Z|\s+)')

In [31]: regex.findall(OUTPUT)
Out[31]: 
['{{172.25.50.10:01:01-Ethernet 172.25.50.10:01:02-Ethernet {Traffic Item 1}}}',
 '{{172.25.50.10:01:02-Ethernet 172.25.50.10:01:01-Ethernet {Traffic Item 1}}}']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...