使用pyparsing在python中解析文本文件

时间:2015-07-30 17:28:15

标签: python pyparsing

我正在尝试使用pyparsing解析以下文本。

acp (SOLO1,
     "solo-100",
     "hi here is the gift"
     "Maximum amount of money, goes",
     430, 90)

jhk (SOLO2,
     "solo-101",
     "hi here goes the wind."
     "and, they go beyond",
     1000, 320)

我已尝试过以下代码,但它无法正常工作。

flag = Word(alphas+nums+'_'+'-')
enclosed = Forward()
nestedBrackets = nestedExpr('(', ')', content=enclosed)
enclosed << (flag | nestedBrackets)

print list(enclosed.searchString (str1))

报价单中的逗号(,)产生不良结果。

1 个答案:

答案 0 :(得分:1)

好吧,我的评论中可能略显过分 - 这里更完整 答案。

如果您真的不必处理嵌套数据项,那么单级括号 每个部分中的数据组将如下所示:

LPAR,RPAR = map(Suppress, "()")
ident = Word(alphas, alphanums + "-_")
integer = Word(nums)

# treat consecutive quoted strings as one combined string
quoted_string = OneOrMore(quotedString)
# add parse action to concatenate multiple adjacent quoted strings
quoted_string.setParseAction(lambda t: '"' + 
                            ''.join(map(lambda s:s.strip('"\''),t)) + 
                            '"' if len(t)>1 else t[0])
data_item = ident | integer | quoted_string

# section defined with no nesting
section = ident + Group(LPAR + delimitedList(data_item) + RPAR)

当你省略逗号之间时,我不确定它是否是故意的 两个连续引用的字符串,所以我选择实现像Python编译器这样的逻辑, 其中两个引用的字符串被视为一个更长的字符串,即"AB CD " "EF""AB CD EF"相同。这是通过quoted_string的定义和添加来完成的 quoted_string的解析操作,以连接2个或更多组件的内容 引用字符串。

最后,我们为整个组

创建一个解析器
results = OneOrMore(Group(section)).parseString(source)
results.pprint()

从您发布的输入样本中获取:

[['acp',
  ['SOLO1',
   '"solo-100"',
   '"hi here is the giftMaximum amount of money, goes"',
   '430',
   '90']],
 ['jhk',
  ['SOLO2',
   '"solo-101"',
   '"hi here goes the wind.and, they go beyond"',
   '1000',
   '320']]]

如果你有嵌套的括号组,那么你的部分定义可以是 就这么简单:

# section defined with nesting
section = ident + nestedExpr()

虽然您已经发现,但这将保留单独的逗号,就像它们一样 是重要的令牌,而不仅仅是数据分隔符。