Расщепления на основе pyparsing - PullRequest
0 голосов
/ 21 февраля 2019

, поэтому я хочу сделать это (но с использованием pyparsing)

Package:numpy11 Package:scipy
will be split into
[["Package:", "numpy11"], ["Package:", "scipy"]]

Мой код пока

package_header = Literal("Package:")
single_package =  Word(printables + " ") + ~Literal("Package:")
full_parser  = OneOrMore( pp.Group( package_header + single_package ) )

Текущий вывод - это

([(['Package:', 'numpy11 Package:scipy'], {})], {})

Я надеялся на что-то вроде этого

([(['Package:', 'numpy11'], {})], [(['Package:', 'scipy'], {})], {})

По сути, остальная часть текста соответствует pp.printables

Я знаю, что могу использовать слова, но хочу сделать

all printables but not the Literal

Как мне это сделать?Спасибо.

1 Ответ

0 голосов
/ 21 февраля 2019

Вам не нужен отрицательный взгляд, т. Е.this:

from pyparsing import *

package_header = Literal("Package:")
single_package =  Word(printables)
full_parser  = OneOrMore( Group( package_header + single_package ) )

print full_parser.parseString("Package:numpy11 Package:scipy")

печатает:

[['Package:', 'numpy11'], ['Package:', 'scipy']]

Обновление: для анализа пакетов, разделенных |, вы можете использовать функцию delimitedList() (теперь вы можететакже есть пробелы в именах пакетов):

from pyparsing import *

package_header = Literal("Package:")
package_name = Regex(r'[^|]+')  # | is a printable, so create a regex that excludes it.
package = Group(package_header + package_name) 
full_parser = delimitedList(package, delim="|" )

print full_parser.parseString("Package:numpy11 foo|Package:scipy")

печатает:

[['Package:', 'numpy11 foo'], ['Package:', 'scipy']]
...