Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么“OneOrMore”在pyparsing中有多个表达式失败?_Python_Grammar_Text Parsing_Pyparsing - Fatal编程技术网

Python 为什么“OneOrMore”在pyparsing中有多个表达式失败?

Python 为什么“OneOrMore”在pyparsing中有多个表达式失败?,python,grammar,text-parsing,pyparsing,Python,Grammar,Text Parsing,Pyparsing,好的,我组装了一个解析器来解析表达式,比如 abc def ghi LONG|SHORT 12345 ----^------ ----^----- --^-- A: alphas B: choice C: num 中编写的解析器如下所示: a = pp.OneOrMore(pp.Word(pp.alphas)).setName("PRT_A") b = pp.Or(['LONG','SHORT']).setName("PRT_B") c = pp.Word(pp.nums).setNa

好的,我组装了一个解析器来解析表达式,比如

abc def ghi LONG|SHORT 12345

----^------ ----^----- --^--
 A: alphas  B: choice  C: num
中编写的解析器如下所示:

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')
当我把“某句话简短地说了13”输入到它时:

我得到一个错误:

ParseException: 
Expected {"LONG" ^ "SHORT"} (at char 21), (line:1, col:22)
"something said SHORT >!<13"
ParseException:
应为{“长”^“短”}(在字符21处)(第1行,第22列)

“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")
或者使用一个或多个
停止
选项:

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

关键不在于联合收割机,而在于一个或多个。同样的问题出现在没有周围联合收割机的情况下。(也许我应该以摆脱联合收割机为例…@Halloeo:不,结果是你有两个错误,联合收割机错误和第二个错误。如果你取出联合收割机,你会得到不同的错误。不幸的是,忽略()用于包括可忽略的表达式,就像空白是可忽略的一样-通常是注释。但您对第二个错误的描述是完全正确的。为了解决这个问题,OneOrMore有一个stop-on选项,可以在看到通常与一个或多个表达式匹配的表达式时停止匹配。此外,Combine也值得怀疑正如你所说-也许团体更合适。为了遵循你的忽略建议,在这种情况下,使用消极的前瞻:
a=~b+pp.Word(pp.alphas)
@PaulMcGuire我知道问题是a与b匹配,.ignore(b)解决方案对我来说很有意义(明天将测试它)。但是,使用否定的前瞻性:
a=~b+pp.Word(pp.alphas)
对我来说没有意义。@user2357112我已将问题简化为仅包含前瞻性问题-我认为这会使问题更加清晰,更有价值。您介意相应地更新(现已接受)答案吗(即,取出关于
Combine
)的内容?答案已更新,但您还应更新问题中的错误消息。没有
Combine
的版本应在稍后的位置产生错误。
b = pp.Or(['LONG','SHORT']).setName("PRT_B")
a = pp.OneOrMore(pp.Word(pp.alphas), stopOn=b).setName("PRT_A")