2016-04-05 3 views
2

У меня есть простой набор данных для анализа с линиями, как следующее:PyParsing: Можно ли глобально подавить все литералы?

R1 (a/30) to R2 (b/30), metric 30 

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

R1, a, 30, R2, 192.168.0.2, 30, 30 

Я могу разобрать все это легко с pyparsing, но я либо заканчиваю кучей литералов в моем выпуске, либо я должен конкретно сказать Literal(thing).suppress() в моей разборной грамматике, которая становится утомительной.

В идеале, я хотел бы написать грамматику для выше как:

Word(alphanums) + '(' + Word(alphanums) + '/' + Word(nums) + ... etc. 

и имеют лексемы, игнорируются. Могу ли я сказать что-нибудь вроде .suppressAllLiterals()?

Примечания:

  • новый для Pyparsing
  • Я прочитал документацию и 5 или 6 примеров
  • поиск Google

Спасибо!

ответ

2

Вы можете использовать этот метод на ParserElement - назовем это сразу после импорта Pyparsing:

from pyparsing import ...whatever... 
ParserElement.inlineLiteralsUsing(Suppress) 

Теперь все строковые литералы в вашем парсер будет обернут в Suppress объектов и вышел из результатов, а не по умолчанию Literal.

(я, вероятно, сделать это по умолчанию в v3.0, когда-нибудь, когда я могу нарушить обратную совместимость.)

+1

Здравствуйте @Paul, спасибо за ответ! Я попробовал это - кажется, что он работает для строк, которые используются inline (например, 'pp.Word (...) + 'somestring' + pp.Word (...)', а не для вещей, которые уже (например, если я заменил '' somestring ''на' myLiteral') Это небольшое изменение очень помогло с ясностью грамматики. Еще раз спасибо за то, что нашли время, очень ценим. –

+0

Конечно , вы всегда можете обернуть 'Suppress (myLiteral)' или просто 'myLiteral.suppress()' тоже. – PaulMcG

+0

Вы также можете создать подавленный литерал с помощью 'Suppress (« blah »)', а класс Suppress будет создавать Literal для вы. – PaulMcG

Смежные вопросы