python - 为什么 `OneOrMore` 在 pyparsing 中因多个表达式而失败?

标签 python grammar text-parsing pyparsing

好的,我组装了一个解析器来解析像这样的表达式

abc def ghi LONG|SHORT 12345

----^------ ----^----- --^--
 A: alphas  B: choice  C: num

pyparsing 中编写的解析器看起来像这样:

a = pp.OneOrMore(pp.Word(pp.alphas)).setName("PRT_A")
b = pp.Or(['LONG','SHORT']).setName("PRT_B")
c = pp.Word(pp.nums).setName("PRT_C")
expr = a('A') + b('B') + c('C')

当我输入“SHORT 13”时:

res = expr.parseString("something said SHORT 13")

我得到错误:

ParseException: 
Expected {"LONG" ^ "SHORT"} (at char 21), (line:1, col:22)
"something said SHORT >!<13"

为什么?我认为 OneOrMore 应该将所有单词相加,直到出现 LONG|SHORT 选择...

最佳答案

这里的问题是 pp.Word(pp.alphas) 包括 "LONG""SHORT",防止 b 来自匹配。您需要阻止它匹配那些关键字,例如使用否定前瞻:

b = pp.Or(['LONG','SHORT']).setName("PRT_B")
a = pp.OneOrMore(~b + pp.Word(pp.alphas)).setName("PRT_A")

或使用 OneOrMorestopOn 选项:

b = pp.Or(['LONG','SHORT']).setName("PRT_B")
a = pp.OneOrMore(pp.Word(pp.alphas), stopOn=b).setName("PRT_A")

关于python - 为什么 `OneOrMore` 在 pyparsing 中因多个表达式而失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41011161/

相关文章:

python - 通过相同的键python将csv转换为json

python - Pyramid 1.4 需要 WebOb 1.2b3+。 Google App Engine 提供 WebOb 1.1.1。难道这一切都要以泪水结束吗?

prolog - 计算 Prolog 中的确定子句语法递归

grammar - 重新定义语法中的ws

python - 为字符串解析 ~4k 文件(复杂的条件)

python - 在 python 中使用 Syntaxnet POS 标签?

python - 打印类属性

python - ctypes 和内存泄漏

javascript - 如何在 JavaCC 中实现对 token 的负 LOOKAHEAD 检查?

r - 从字符串中解析数据