2014-01-07 205 views
1

默认情况下,pyparsing只删除前导空格。删除尾随空格

所以这解析

'between (1, map( v7 , 2 ))' 

给我

['between', [['1'], ['map', [['v7 '], ['2 ']]]]] 

,而不是

['between', [['1'], ['map', [['v7'], ['2']]]]] 

但如何使用pyparsing删除尾部空格?

的代码是:

from pyparsing import Forward, Word, alphas, alphanums, nums, Literal, Group, delimitedList, Optional 
lparen = Literal("(").suppress() 
rparen = Literal(")").suppress() 
name = Optional(Word(alphanums + '_ ', alphanums + '_ ')) 
functor = Word(alphas, alphanums) 
integer = Word(nums) 
expression = Forward() 
arg = Group(expression) |name | integer 
args = delimitedList(arg) 
expression << ((functor + lparen + args + rparen) | name) 

print(expression.parseString("between (1, map( v7 , 2 ))")) 
>>> ['between', ['1'], ['map', ['v7 '], ['2 ']]] 

pyparsing。 版本 ='2.0.1'和python3。

此时我使用额外的外部函数来解析和修复数据。

+2

你能否包含你用来获得这个的解析器代码?如果你告诉它,pyparsing将只包含匹配内容的空格。 – PaulMcG

+0

在某些时候,你必须告诉pyparsing保留空格。默认情况下,它将删除所有空白并为您标记。正如保罗所说,除非你发表你的语法,否则我们无法帮助你。 – Hooked

+1

运行您的发布代码会在''['1'],['map',['v7'],['2']]]'之间打印'['' - 不存在尾部空格。 – PaulMcG

回答

0

发布的代码有两次出现alphanums + '_ ' - 将它们都更改为alphanums + '_'(移除空格)可以实现您正在描述的内容。

from pyparsing import Forward, Word, alphas, alphanums, nums, Literal, Group, delimitedList, Optional 

lparen = Literal("(").suppress() 
rparen = Literal(")").suppress() 
name = Optional(Word(alphanums + '_', alphanums + '_')) 
functor = Word(alphas, alphanums) 
integer = Word(nums) 
expression = Forward() 
arg = Group(expression) | name | integer 
args = delimitedList(arg) 
expression << ((functor + lparen + args + rparen) | name) 

print(expression.parseString("between (1, map( v7 , 2 ))")) 

打印:

['between', ['1'], ['map', ['v7'], ['2']]] 

我不知道如果你能达到从评论这个结论,但看起来这就是Paul McGuire被描述。也就是说,pyparsing只包含匹配项中的空格,因为alphanums + '_ '包含匹配项中的空格。