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

2024-04-20 04:01:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我的工作方式:

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)

我不确定,所以我想在联系作者之前得到一些反馈。你知道吗

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


Tags: rest解析器示例example方式作者标识符pyparsing
1条回答
网友
1楼 · 发布于 2024-04-20 04:01:07

哎呀!使用两个Word构建标识符是浪费、低效的,而且是糟糕的语法分析实践。我认为作者这样做是为了展示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

相关问题 更多 >