Как использовать литерал для разделения одного или нескольких слов?
Мне нужно составить правило для оценки следующих выражений.
Sao Paulo to Rio de Janeiro >> ["Sao Paulo", "Rio de Janeiro"]
Rio de Janeiro to Brasilia >> ["Rio de Janeiro", "Brasilia"]
Brasilia to Sao Jose dos Pinhais >> ["Brasilia", "Sao Jose dos Pinhais"]
Я безуспешно пытался
from pyparsing import *
source = OneOrMore(Word(alphas))
target = OneOrMore(Word(alphas))
expression = source + Literal('to') + target
# input string
phase = "Sao Paulo to Rio de Janeiro"
# parse input string
print phase, "->", expression.parseString( phase )
1 ответ
Решение
Проблема в том, что OneOrMore (Word (alphas)) является жадным, так как "to" соответствует Word (alphas), вам нужно включить в него заглядывание.
Вы можете удалить его, добавив оператор NOT (aka ~), который ищет "to" специально и прекратит сопоставление. Тогда проблема в том, что какое бы слово ни было перед "до", оно не является частью выражения. Таким образом, вы должны добавить еще одно Слово (альфы) в конце.
to = Suppress(Literal('to'))
src = Group(ZeroOrMore(Word(alphas) + ~FollowedBy(to)) + Word(alphas)).setResultsName('src')
dst = OneOrMore(Word(alphas)).setResultsName('dst')
exp = src + to + dest
phase = "Sao Paulo to Rio de Janeiro"
# parse input string
s = exp.parseString( phase )
И когда вы запустите его, вы получите желаемый результат:
['Sao', 'Paulo']
['Rio', 'de', 'Janeiro']