gpt4 book ai didi

python - Pyparsing:快速引用解析器定义正确吗?

转载 作者:太空宇宙 更新时间:2023-11-03 16:55:02 25 4
gpt4 key购买 nike

我的工作方式:

Pyparsing Quick Reference, Chapter 3: Small Example -

示例解析器应该匹配有效的 Python 标识符,因此

'a_#'

应该是无效的,就像作者评论的那样,对吧?但是,在页面底部:

---Test for 'a_#'
Matches: ['a', '_']

这是解析器:

first = pp.Word(pp.alphas+"_", exact=1)
rest = pp.Word(pp.alphanums+"_")
identifier = first+pp.Optional(rest)

我不确定,所以在联系作者之前我希望得到一些反馈。

另外,我试图通过构建一个解析器来纠正它,该解析器只接受整个字符串中定义的字符范围,因此它不会匹配它的前缀。无法正确处理 - 有什么建议吗?

最佳答案

哎呀!使用两个 Word 构建标识符是浪费、低效的,而且是糟糕的 pyparsing 实践。我认为作者这样做是为了展示如何在此处使用 Combine,但事后,他应该仅使用单个 Word 表达式来展示更好的替代方案。

Word 针对这种情况有一个双参数格式(明确描述 in the online docs ):

valid_ident_leading_chars = alphas + '_'
valid_ident_body_chars = alphanums + '_'
identifier = Word(valid_ident_leading_chars, valid_ident_body_chars)

(顺便说一句,这相当于:

identifier = Regex('['+valid_ident_leading_chars+']['+valid_ident_body_chars+']*')

如果您查看 pyparsing 代码,您会发现 Word 通过构建该正则表达式来实现其匹配。)

这仍然会解析 'a_#' 的前导部分,与正则表达式相同。如果您希望测试因未解析完整字符串而失败,请使用:

identifier.parseString('a_#', parseAll=True)

为了简化编写测试,您还可以使用“==” - 当将 pyparsing 表达式与字符串进行比较时,该表达式将运行 expr.parseString(comparison_string, parseAll=True),并且根据是否引发 ParseException 返回 True/False。

assert 'a_' == identifier    # <-- will pass
assert 'a_#' == identifier # <-- will fail

关于python - Pyparsing:快速引用解析器定义正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35483282/

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