Как использовать литерал для разделения одного или нескольких слов?

Мне нужно составить правило для оценки следующих выражений.

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']
Другие вопросы по тегам