gpt4 book ai didi

python - 为什么pyparsing的可选总是返回一个列表

转载 作者:行者123 更新时间:2023-12-04 07:47:09 25 4
gpt4 key购买 nike

我正在尝试从 SQL 语句中获取 LIMIT

query = "LIMIT 1"

LIMIT = "LIMIT"

int_num = pyparsing_common.signed_integer()

limit_clause = Optional(Group(LIMIT + int_num), None)
statement = limit_clause("limit")


if __name__ == "__main__":
result = statement.parseString(query)
print(result["limit"])
打印 [['LIMIT', 1]]这当然是一个人为的例子,但是为什么它返回为 [['LIMIT', 1]]而不仅仅是 1 ?有没有办法让它只返回一个 1 ?

最佳答案

根据 pyparsing 的文档:

  • 运营商+ Expression operator即“使用运算符前后的表达式创建 And”,
  • 类(class)And Expression subclass那“用 ParserElements 列表构造,所有这些都必须匹配 And 才能匹配”,
  • 类(class)Groupspecial subclass “导致匹配的标记包含在列表中”,
  • 类(class)Optional Expression subclass即“使用 ParserElement 构造,但此元素不需要匹配;可以使用可选的 default 参数构造,...”。

  • 大概是 +运算符创建结果列表 'LIMIT'pyparsing.pyparsing_common.signed_integer() ,然后是类 Group创建一个包含此列表的列表。这解释了为什么 'LIMIT'1出现在结果中,以及为什么它们在嵌套列表中。
    实际情况稍微复杂一点,因为返回的对象不是 list s,但类的实例 pyparsing.ParseResults .运行以下代码:
    import pyparsing

    # construct parser
    LIMIT = 'LIMIT'
    int_num = pyparsing.pyparsing_common.signed_integer()
    limit_clause = pyparsing.Optional(pyparsing.Group(LIMIT + int_num), None)
    statement = limit_clause('limit')
    # parse a string
    query = 'LIMIT 1'
    result = statement.parseString(query)
    print(repr(result))
    打印:
    ([(['LIMIT', 1], {})], {'limit': [([(['LIMIT', 1], {})], {})]})
    然后语句 print(repr(result['limit']))打印:
    ([(['LIMIT', 1], {})], {})
    和声明 print(str(result['limit']))打印:
    [['LIMIT', 1]]
    对于后代,此答案使用 pyparsing == 2.4.7 ( pyparsing( GitHub repository)的当前开发版本已从单个模块显着重组为一个包,特别是在提交 0b398062710dc00b952636bcf7b7933f74f125da 中)。
    关于类 ParseResults 的一些与版本相关的评论,用于表示每个解析器的结果:
  • pyparsing == 2.4.7 的来源中, 类(class) ParserResults位于 pyparsing.ParserResults : https://github.com/pyparsing/pyparsing/blob/pyparsing_2.4.7/pyparsing.py#L502-L1207
  • 新版类ParserResults在模块中 pyparsing.results : https://github.com/pyparsing/pyparsing/blob/d27fd7627f3ed60b3b7a9e9f5e790d0e49107359/pyparsing/results.py#L27-L82
  • 旧版本的代码已复制到模块 pyparsing_archivepyparsing 的顶层目录中存储库,并且似乎未使用(例如,安装或导入)。所以旧版类ParserResults现在在:https://github.com/pyparsing/pyparsing/blob/d27fd7627f3ed60b3b7a9e9f5e790d0e49107359/pyparsing_archive.py#L599-L1249
  • 关于python - 为什么pyparsing的可选总是返回一个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67154197/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com