繁体   English   中英

简单的嵌套表达式与pyparsing匹配

[英]Simple nested expression matching with pyparsing

我想匹配一个看起来像这样的表达式:

(<some value with spaces and m$1124any crazy signs> (<more values>) <even more>)

我只想沿方括号()拆分这些值。 目前,我可以减少s-expression示例中的pyparsing开销,因为这是广泛且难以理解的 (IMHO)。

我可以使用nestedExpr语句,将其减少为一行:

import pyparsing as pp
parser = pp.nestedExpr(opener='(', closer=')')
print parser.parseString(example, parseAll=True).asList()

结果也似乎在空白处被分割,我不希望这样做:

  skewed_output = [['<some',
  'value',
  'with',
  'spaces',
  'and',
  'm$1124any',
  'crazy',
  'signs>',
  ['<more', 'values>'],
  '<even',
  'more>']]
expected_output = [['<some value with spaces and m$1124any crazy signs>' 
['<more values>'], '<even more>']]
best_output = [['some value with spaces and m$1124any crazy signs' 
['more vlaues'], 'even more']]

可选地,我很乐意在任何地方都可以读到一些易于理解的介绍,例如如何包括更详细的解析器(我想提取<>括号之间的值并将其匹配(请参阅best_output ),但是我可以之后总是将它们string.strip()

提前致谢!

Pyparsing的nestedExpr接受contentignoreExpr参数,这些参数指定什么是s-expr的“单个项目”。 您可以在此处传递QuotedString 不幸的是,我对文档中两个参数之间的区别还不够了解,但是一些实验表明,以下代码应满足您的要求:

import pyparsing as pp

single_value = pp.QuotedString(quoteChar="<", endQuoteChar=">")
parser = pp.nestedExpr(opener="(", closer=")",
                       content=single_value,
                       ignoreExpr=None)

example = "(<some value with spaces and m$1124any crazy signs> (<more values>) <even more>)"
print(parser.parseString(example, parseAll=True))

输出:

[['some value with spaces and m$1124any crazy signs', ['more values'], 'even more']]

它期望列表以( ,以)结尾,并包含一些可选的用空格分隔的列表或带引号的字符串,每个带引号的字符串应以<开头,以>结束并且不包含<内部。

您可以更多地使用contentignoreExpr参数来发现content=None, ignoreExpr=single_value使content=None, ignoreExpr=single_value接受带引号和不带引号的字符串(以及带空格的不带引号的字符串):

import pyparsing as pp

single_value = pp.QuotedString(quoteChar="<", endQuoteChar=">")
parser = pp.nestedExpr(opener="(", closer=")", ignoreExpr=single_value, content=None)

example = "(<some value with spaces and m$1124any crazy signs> (<more values>) <even m<<ore> foo (foo) <(foo)>)"
print(parser.parseString(example, parseAll=True))

输出:

[['some value with spaces and m$1124any crazy signs', ['more values'], 'even m<<ore', 'foo', ['foo'], '(foo)']]

一些问题悬而未决:

  1. 为什么pyparsing会忽略连续列表项之间的空格?
  2. contentignoreExpr什么区别,什么时候应该使用它们?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM