为什么 `OneOrMore` 在 pyparsing 中因多个表达式而失败?
Why does `OneOrMore` fails with more than one expression in 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')
当我把 "something said 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")
或使用 stopOn
选项 OneOrMore
:
b = pp.Or(['LONG','SHORT']).setName("PRT_B")
a = pp.OneOrMore(pp.Word(pp.alphas), stopOn=b).setName("PRT_A")
好的,我组装了一个解析器来解析像
这样的表达式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')
当我把 "something said 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")
或使用 stopOn
选项 OneOrMore
:
b = pp.Or(['LONG','SHORT']).setName("PRT_B")
a = pp.OneOrMore(pp.Word(pp.alphas), stopOn=b).setName("PRT_A")