Hyp*_*eus 8 python newline pyparsing
我刚刚开始,pyparsing我遇到了换行问题.
我的语法是:
from pyparsing import *
newline = LineEnd () #Literal ('\n').leaveWhitespace ()
minus = Literal ('-')
plus = Literal ('+')
lparen = Literal ('(')
rparen = Literal (')')
ident = Word (alphas)
integer = Word (nums)
arith = Forward ()
parenthized = Group (lparen + arith + rparen)
atom = ident | integer | parenthized
factor = ZeroOrMore (minus | plus) + atom
arith << (ZeroOrMore (factor + (minus | plus) ) + factor)
statement = arith + newline
program = OneOrMore (statement)
Run Code Online (Sandbox Code Playgroud)
现在,当我解析以下内容时:
print (program.parseString ('--1-(-a-3+n)\nx\n') )
Run Code Online (Sandbox Code Playgroud)
结果如预期:
['-', '-', '1', '-', ['(', '-', 'a', '-', '3', '+', 'n', ')'], '\n', 'x', '\n']
Run Code Online (Sandbox Code Playgroud)
但是当第二行可以被解析为第一行的尾部时,第一行\n是否已经被淘汰了?
码:
print (program.parseString ('--1-(-a-3+n)\n-x\n') )
Run Code Online (Sandbox Code Playgroud)
实际结果:
['-', '-', '1', '-', ['(', '-', 'a', '-', '3', '+', 'n', ')'], '-', 'x', '\n']
Run Code Online (Sandbox Code Playgroud)
预期结果:
['-', '-', '1', '-', ['(', '-', 'a', '-', '3', '+', 'n', ')'], '\n', '-', 'x', '\n']
Run Code Online (Sandbox Code Playgroud)
实际上我不希望解析器自动加入语句.
1.我做错了什么?
2.我该如何解决这个问题?
3.引擎盖下发生了什么导致这种行为(这肯定是明智的,但我只是没有看到这一点)?
Pau*_*McG 11
'\n'通常作为空格字符跳过.如果你想要'\n'是重要的,那么你必须调用setDefaultWhitespaceChars删除'\n'作为可跳过的空格(你必须在定义任何pyparsing表达式之前执行此操作):
from pyparsing import *
ParserElement.setDefaultWhitespaceChars(' \t')
Run Code Online (Sandbox Code Playgroud)
小智 5
这里发生的事情是解析器默认忽略任何空格。在定义任何元素之前,您需要添加以下代码行:
ParserElement.setDefaultWhitespaceChars(" \t")
Run Code Online (Sandbox Code Playgroud)
我相信,正常的默认空白字符是“\t\r\n”。
编辑:保罗打败了我。一起吃完晚饭我应该精神焕发。:)