Можно ли дать pyparsing проанализированный список и вернуть исходную строку?
Разбор списка с помощью pyparsing
Ответы (1)
Да, можете, если вы дали парсеру указание не отбрасывать ввод. Вы делаете это с помощью комбинатора Combine
.
Допустим, ваш ввод:
>>> s = 'abc,def, ghi'
Вот синтаксический анализатор, который получает точный текст списка:
>>> from pyparsing import *
>>> myList = Word(alphas) + ZeroOrMore(',' + Optional(White()) + Word(alphas))
>>> myList.leaveWhitespace()
>>> myList.parseString(s)
(['abc', ',', 'def', ',', ' ', 'ghi'], {})
Чтобы «разобрать»:
>>> reconstitutedList = Combine(myList)
>>> reconstitutedList.parseString(s)
(['abc,def, ghi'], {})
который возвращает вам исходный ввод.
Но за это приходится платить: все эти лишние пробелы, плавающие в виде токенов, обычно неудобны, и вы заметите, что нам пришлось явно отключить пропуск пробелов отключить в myList
. Вот версия, которая удаляет пробелы:
>>> myList = Word(alphas) + ZeroOrMore(',' + Word(alphas))
>>> myList.parseString(s)
(['abc', ',', 'def', ',', 'ghi'], {})
>>> reconstitutedList = Combine(myList, adjacent=False)
>>> reconstitutedList.parseString(s)
(['abc,def,ghi'], {})
Обратите внимание, что на данный момент вы не получаете буквальный ввод обратно, но этого может быть достаточно для вас. Также обратите внимание, что мы должны были явно указать Combine разрешить пропуск пробелов.
Однако на самом деле во многих случаях вы даже не заботитесь о разделителях; вы хотите, чтобы синтаксический анализатор сосредоточился на самих элементах. Есть функция commaSeparatedList
, которая удобно удаляет как разделители, так и пробелы:
>>> myList = commaSeparatedList
>>> myList.parseString(s)
(['abc', 'def', 'ghi'], {})
В этом случае, однако, шаг «депарсинга» не имеет достаточно информации, чтобы восстановленная строка имела смысл:
>>> reconstitutedList = Combine(myList, adjacent=False)
>>> reconstitutedList.parseString(s)
(['abcdefghi'], {})
originalTextFor
для некоторых возможностей, подобных описанным вами, но которые могут сохранять даже промежуточные пробелы.
- person PaulMcG; 13.07.2010