标签: pyparsing

pyparsing:组合多个元素的setResultsName

这是我正在解析的文本:

x ~ normal(mu, 1)
y ~ normal(mu2, 1)
Run Code Online (Sandbox Code Playgroud)

解析器使用以下方式匹配这些行:

model_definition = Group(identifier.setResultsName('random_variable_name') + '~' + expression).setResultsName('model_definition')

// end of line: .setResultsName('model_definition')
Run Code Online (Sandbox Code Playgroud)

问题是,当有两个模型定义时,它们不会在 ParseResults 对象中单独命名:

在此输入图像描述

看起来第一个被第二个覆盖了。我命名它们的原因是为了使执行这些行变得更容易 - 这样我(希望)不必弄清楚在评估时发生了什么 - 解析器已经标记了所有内容。我如何才能同时标记model_definition这两个标签?model_definition如果能保存找到的每个模型定义的列表,那就太好了。

以防万一,这是我的更多代码:

model_definition = Group(identifier.setResultsName('random_variable_name') + '~' + expression).setResultsName('model_definition')
expression << Or([function_application, number, identifier, list_literal, probability_expression])
statement = Optional(newline) + Or([model_definition, assignment, function_application]) + Optional(newline)
line = OneOrMore('\n').suppress()
comment = Group('#' + SkipTo(newline)).suppress()
program = OneOrMore(Or([line, statement, comment]))
ast = program.parseString(input_string)
return ast
Run Code Online (Sandbox Code Playgroud)

python pyparsing

2
推荐指数
1
解决办法
1958
查看次数

在 PyParsing 中,如何指定一个 Word 不等于给定的文字?

我正在尝试解析来自http://www.apkmirror.com的APK下载页面,例如http://www.apkmirror.com/apk/google-inc/gmail/gmail-7-3-26-152772569-release -release/gmail-7-3-26-152772569-release-android-apk-download/。通常,“APK 详细信息”部分具有以下结构:

在此输入图像描述

我想将“17329196”解析为version_code,“arm”解析为architecture,“com.skype.m2”解析为package。然而,有时, with 行architecture会丢失,如下所示:

在此输入图像描述

到目前为止,使用Scrapy和选择器

apk_details = response.xpath('//*[@title="APK details"]/following-sibling::*[@class="appspec-value"]//text()').extract()
Run Code Online (Sandbox Code Playgroud)

我已经能够提取包含上面显示的“行”的列表。我正在尝试编写一个函数,parse_apk_details以便通过以下测试:

import pytest

def test_parse_apk_details_with_architecture():
    apk_details = [u'Version: 3.0.38_ww (4030038)',
                   u'arm ',
                   u'Package: com.lenovo.anyshare.gps',
                   u'\n',
                   u'2,239 downloads ']

    version_code, architecture, package = parse_apk_details(apk_details)

    assert version_code == 4030038
    assert architecture == "arm"
    assert package == "com.lenovo.anyshare.gps"

@pytest.mark.skip(reason="This does not work yet, because 'Package:' is interpreted by the parser as the architecture.")
def test_parse_apk_details_without_architecture():
    apk_details …
Run Code Online (Sandbox Code Playgroud)

python pyparsing scrapy

2
推荐指数
1
解决办法
1044
查看次数

pyparsing字符串的引用名称

我有一个字符串,可以包含这样的东西:

s = "'Mark, Bob','John'"
Run Code Online (Sandbox Code Playgroud)

解析为3个字符串的最佳方法是什么?我对pyparsing很新,我担心我不太了解它

(编辑)对不起,我不是很清楚.这是使用语法和pyparsing来解析文件的程序的一部分.这是输入的一小部分,我不知道该怎么做.这应该真正代表一个由三个名字组成的数组,这就是我想要从中得到的.

谢谢

python string pyparsing

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

在python中将简单命令转换为AST

我想在Python中使用一个函数将字符串命令转换为AST(抽象语法树).

该命令的语法如下:

commandName(3, "hello", 5.0, x::int)
Run Code Online (Sandbox Code Playgroud)

命令可以接受任意数量的逗号分隔值

  1. 整型
  2. 字符串
  3. 花车
  4. 类型

假设函数被调用convert_to_ast,那么

convert_to_ast('commandName(3, "hello", 5.0, x::int)')
Run Code Online (Sandbox Code Playgroud)

应该产生以下AST:

{ 
  'type': 'command',
  'name': 'commandName',
  'args': [{
    'type': 'int',
    'value': 3
  }, {
    'type': 'str',
    'value': 'Hello'
  }, {
    'type': 'float',
    'value': 5.0
  }, {
    'type': 'var',
    'kind': 'int',
    'name': 'x
  }]
Run Code Online (Sandbox Code Playgroud)

python parsing abstract-syntax-tree pyparsing

0
推荐指数
1
解决办法
130
查看次数