|
создает выражение «соответствует первому», а не «соответствует самому длинному».
Первой альтернативой является регулярное выражение, которое будет соответствовать 0 или более пробельным символам. Фактически, это соответствует , поэтому точка не анализируется.
Тогда следующий элемент для разбора - StringEnd
, но позиция разбора по-прежнему находится в «.», Так что не получится!
Вот несколько более подробных выводов путем добавления вызовов setDebug()
к вашим выражениям грамматики:
>>> w = Word(alphas).setDebug() + (ws.setDebug() | dot.setDebug()) + StringEnd()
>>> w.parseString('AMIT.')
Match W:(abcd...) at loc 0(1,1)
Matched W:(abcd...) -> ['AMIT']
Match Re:('\\s*') at loc 4(1,5)
Matched Re:('\\s*') -> ['']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\python26\lib\site-packages\pyparsing-1.5.6-py2.6.egg\pyparsing.py", line 1032, in parseString
raise exc
pyparsing.ParseException: Expected end of text (at char 4), (line:1, col:5)
Чтобы заставить вашу грамматику работать, вы могли бы:
изменить оператор |
на ^
(совпадение самое длинное, а не совпадение первым)
изменить регулярное выражение на \s+
вместо \s*
(чтобы для совпадения требовался хотя бы один пробел)
измените свой второй срок на Optional(dot)
Как правило, явное тестирование для пробелов не согласуется с философией pyparsing - pyparsing отличается от re.