标签: pyparsing

将正则表达式解析为Word

我正在构建一个语法分析器,以对使用点表示法标识的对象执行简单的操作,如下所示:

DISABLE ALL;
ENABLE A.1 B.1.1 C
Run Code Online (Sandbox Code Playgroud)

但在DISABLE ALL关键字ALL中却匹配为3,Regex(r'[a-zA-Z]') => 'A', 'L', 'L'我用来匹配参数。

如何使用正则表达式制作单词?我无法A.1.1使用Word的AFAIK

请参见下面的示例

import pyparsing as pp

def toggle_item_action(s, loc, tokens):
    'enable / disable a sequence of items'
    action = True if tokens[0].lower() == "enable" else False
    for token in tokens[1:]:
        print "it[%s].active = %s" % (token, action)

def toggle_all_items_action(s, loc, tokens):
    'enable / disable ALL items'
    action = True if tokens[0].lower() == "enable" else False
    print "it.enable_all(%s)" …
Run Code Online (Sandbox Code Playgroud)

python pyparsing

5
推荐指数
1
解决办法
2352
查看次数

context in pyparsing parse actions besides globals

I'd like to be able to parse two (or any number) of expressions, each with their own set of variable definitions or other context.

There doesn't seem to be an obvious way to associate a context with a particular invocation of pyparsing.ParseExpression.parseString(). The most natural way seems to be to use an instancemethod of some class as the parse actions. The problem with this approach is that the grammar must be redefined for each parse context (for instance, in …

python pyparsing

5
推荐指数
1
解决办法
1678
查看次数

如何使用Pyparsing为以下数据创建语法

我有类似于YAML的数据,需要使用Pyparsing为它创建语法.与Python一样,Yaml的数据范围由空白定义

数据:

object : object_name 
comment : this object is created first 
methods:   
  method_name:
    input: 
      arg1: arg_type
      arg2: arg2_type
    output:   

  methond2_name:
    input:
    output:
      arg1 : arg_type
Run Code Online (Sandbox Code Playgroud)

解析上面的内容之后,它应该输出类似于这样的东西:

{'comment': 'this object is created first',
 'object': 'object_name',
 'methods': {'method_name': {'input': {'arg1': 'arg_type', 'arg2': 'arg2_type'}, 
 'output': None}, 'methond2_name': {'input': None, 'output': {'arg1': 'arg_type'}}}}
Run Code Online (Sandbox Code Playgroud)

[编辑]数据类似于YAML但不完全相同.所以YAML Python解析器无法解析它.我留下了一些细节,以使示例数据更简单

python parsing pyparsing

5
推荐指数
1
解决办法
739
查看次数

如何在pyparsing中迭代ParseResults

我的 PyParsing 语法有以下测试代码:

from pyparsing import Word, nums, alphas, delimitedList, Group, oneOf
from pprint import pprint

field = Word(alphas)("field")
operator = oneOf("= +")("operator")
string_value = Word(alphas)("string")
int_value = Word(nums).setParseAction(lambda t: int(t[0]))("int")
value = (string_value | int_value )("value")
expression = Group(field + operator + value)("expression")
grammar = Group(delimitedList(expression, delim="&&"))("expr_list")

def test(s):
    print "Parsing '{0}'".format(s)
    tokenized = grammar.parseString(s)
    for f in tokenized:
        e = f.expression
        pprint(dict(e.items()))

if __name__ == "__main__":
    test("foo=1")
    test("foo=1 && bar=2")
    test("foobar=2 && snakes=4")
Run Code Online (Sandbox Code Playgroud)

输出非常出乎意料 - 似乎我只得到了最后一个表达式 …

python iteration pyparsing

5
推荐指数
1
解决办法
1465
查看次数

`pyparsing`:迭代`ParsedResults`

我刚开始使用pyparsing这个晚上,我已经构建了一个复杂的语法,它描述了我正在非常有效地工作的一些来源.它非常简单而且非常强大.但是,我在使用时遇到了一些麻烦ParsedResults.我需要能够按照它们被找到的顺序迭代嵌套的标记,并且我发现它有点令人沮丧.我已将问题抽象为一个简单的案例:

import pyparsing as pp

word = pp.Word(pp.alphas + ',.')('word*')
direct_speech = pp.Suppress('“') + pp.Group(pp.OneOrMore(word))('direct_speech*') + pp.Suppress('”')
sentence = pp.Group(pp.OneOrMore(word | direct_speech))('sentence')

test_string = 'Lorem ipsum “dolor sit” amet, consectetur.'

r = sentence.parseString(test_string)

print r.asXML('div')

print ''

for name, item in r.sentence.items():
    print name, item

print ''

for item in r.sentence:
    print item.getName(), item.asList()
Run Code Online (Sandbox Code Playgroud)

据我所见,这应该有用吗?这是输出:

<div>
  <sentence>
    <word>Lorem</word>
    <word>ipsum</word>
    <direct_speech>
      <word>dolor</word>
      <word>sit</word>
    </direct_speech>
    <word>amet,</word>
    <word>consectetur.</word>
  </sentence>
</div>

word ['Lorem', 'ipsum', 'amet,', 'consectetur.']
direct_speech [['dolor', 'sit']]

Traceback …
Run Code Online (Sandbox Code Playgroud)

python pyparsing

5
推荐指数
2
解决办法
486
查看次数

解析嵌套的三元表达式

我的PyParsing任务的继续是解析嵌套的三元表达式(例如(x == 1 ? true : (y == 10 ? 100 : 200))).因此,我构造了以下表达式.对我来说,这看起来很直观.但是我没有匹配:

any = Word(printables)

conditional = Forward()
sub_exp = (conditional | any)
conditional = Literal('(') + sub_exp + Literal('?') + sub_exp + Literal(':') + sub_exp + Literal(')')

    for exp in conditional.scanString(block_str):
        print exp
Run Code Online (Sandbox Code Playgroud)

最初我认为问题是印刷品消耗一切; 我将excludeChars设置为不匹配:?)(,但这也没有帮助.另一种方法是构造嵌套表达式,每个用于" (? "," ?: "和" :) "块.但这种方法非常混乱.有人对解析三元表达式有什么建议吗?

更新 使用下面的答案,但修改为使用scanString:

但是,当使用scanString时,它也会返回许多其他匹配(基本上,与atom匹配的任何内容).

lpar = Literal('(').suppress()
rpar = Literal(')').suppress()
any = Combine(OneOrMore(Word(printables, excludeChars='()?:') | White(' ', max=1)))
expr = Forward()
atom = any …
Run Code Online (Sandbox Code Playgroud)

python pyparsing

5
推荐指数
1
解决办法
780
查看次数

pyparsing 中的注释

我有一个非常简单的语法。基本上它由块组成,每个块都以一个&名称开头,并向下延伸到下一个或文件末尾。此外,还有两种注释:单行注释,从 a*到行尾,以及 C 风格的注释,包含在/* */. 注释也可以在块内。到目前为止我的尝试:

#!/usr/bin/env python
from pyparsing import *

NL = Suppress( LineEnd() )
restOfLineNL = restOfLine + NL

LineComment = Literal('*') + restOfLineNL
BlockComment = nestedExpr('/*', '*/')
Comment = BlockComment | LineComment

ModuleName = LineStart() + Word( '&', alphanums + '_', min=2 ) + NL
Module = ModuleName + SkipTo( StringEnd() | ModuleName, include=False)
Grammar = ZeroOrMore( Module )
Grammar.ignore(Comment)

result = Grammar.parseString('''
&keyword1

*comment

&keyword2
arbitrary lines
* with …
Run Code Online (Sandbox Code Playgroud)

python pyparsing

5
推荐指数
0
解决办法
1247
查看次数

pyparsing:命名结果?

我正在编写一个解析器来解析数学表达式,其中包含变量。我想要所有捕获到的变量的列表。但是我只得到最后捕获的变量。下面是显示问题的最小示例。

    >>> from pyparsing import *
    >>> var = Word(alphas)
    >>> expr = Forward()
    >>> expr << var('var') + ZeroOrMore(Literal('+') + expr)
    >>> foo = expr.parseString("x + y + z")
    >>> foo
    (['x', '+', 'y', '+', 'z'], {'var': [('x', 0), ('y', 2), ('z', 4)]})
    >>> foo['var']
    'z'
Run Code Online (Sandbox Code Playgroud)

我期待着['x','y','z']。我正在使用pyparsing 2.1版。

python parsing pyparsing

5
推荐指数
1
解决办法
256
查看次数

PyParsing Optional() 挂起

仅使用 Optional 或 ZeroOrMore 时,pyparsing 似乎进入了无限循环。以下代码有效,但“# 应该与 pp.Optional() 一起使用”部分确实应该是 Optional 而不是 OneOrMore。在这种情况下,我应该放置某种 stopOn 吗?

字典如下图所示:

其中 [expr] 表示可选 expr,而 [expr]... 表示可以重复的可选 expr,所以 ZeroOrMore:

[PINS numPins ;
  [ – pinName + NET netName
  [+ SPECIAL]
  [+ DIRECTION {INPUT | OUTPUT | INOUT | FEEDTHRU}]
  [+ NETEXPR "netExprPropName defaultNetName"]
  [+ SUPPLYSENSITIVITY powerPinName]
  [+ GROUNDSENSITIVITY groundPinName]
  [+ USE {SIGNAL | POWER | GROUND | CLOCK | TIEOFF | ANALOG | SCAN | RESET}]
  [+ ANTENNAPINPARTIALMETALAREA value [LAYER layerName]] ...
  [+ ANTENNAPINPARTIALMETALSIDEAREA value [LAYER …
Run Code Online (Sandbox Code Playgroud)

python text-parsing pyparsing python-3.x

5
推荐指数
1
解决办法
199
查看次数

使用二元和一元运算符、保留字且不带括号解析表达式

我正在尝试解析由二元运算符+、一元运算符not和标识符组成的表达式,这些标识符可以是任何非字母字符串not

from pyparsing import (
    CaselessKeyword,
    Combine,
    Word,
    alphas,
    opAssoc,
    infixNotation,
)

identifier = Combine(~CaselessKeyword('not') + Word(alphas))
expression = infixNotation(identifier, [
  ('+', 2, opAssoc.LEFT),
  (CaselessKeyword('not'), 1, opAssoc.RIGHT),
]
Run Code Online (Sandbox Code Playgroud)

跑步

expression.parseString('a + (not b)')
Run Code Online (Sandbox Code Playgroud)

给出了我的期望

[['a', '+', ['not', 'b']]]
Run Code Online (Sandbox Code Playgroud)

但是,没有括号

expression.parseString('a + not b')
Run Code Online (Sandbox Code Playgroud)

我只得到第一个令牌:

['a']
Run Code Online (Sandbox Code Playgroud)

我如何定义语言以在没有括号的情况下按照我的意愿工作?

(在实际情况中,有更多的运算符和保留字:这是解析 S3 Select 语言的一步)

python parsing pyparsing amazon-s3-select

5
推荐指数
1
解决办法
347
查看次数