为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Pyparsing中捕获运算符之前的所有内容

如何在Pyparsing中捕获运算符之前的所有内容

忽然笑 2021-05-14 06:12:30
我正在尝试创建pyparsing语法。我想将空格分隔的实体捕获为运算符“和” /“或”之前的单个单词。预期结果是:(United kingdom or Sweden)['United kingdom','or','Sweden']我得到的是['United', 'kingdom','or','Sweden']到目前为止的代码from pyparsing import *import jsonQUOTED = quotedString.setParseAction(removeQuotes)OAND = CaselessLiteral("and")OOR = CaselessLiteral("or")ONOT = CaselessLiteral("not")WORDWITHSPACE = Combine(OneOrMore(Word(printables.replace("(", "").replace(")", "")) | White(    ' ') + ~(White() | OAND | ONOT | OOR)))TERM = (QUOTED | WORDWITHSPACE)EXPRESSION = operatorPrecedence(TERM,                                [                                    (ONOT, 1, opAssoc.RIGHT),                                    (OAND, 2, opAssoc.LEFT),                                    (OOR, 2, opAssoc.LEFT)                                ])STRING = OneOrMore(EXPRESSION) + StringEnd()
查看完整描述

1 回答

?
Helenr

TA贡献1780条经验 获得超4个赞

我重新定义了WORDWITHSPACE,如下所示:


# space-separated words are easiest to define using just OneOrMore

# must use a negative lookahead for and/not/or operators, and this must come

# at the beginning of the expression

WORDWITHSPACE = OneOrMore(~(OAND | ONOT | OOR) + Word(printables, excludeChars="()"))


# use a parse action to recombine words into a single string

WORDWITHSPACE.addParseAction(' '.join)

通过对您的代码示例进行的这些更改,我得以编写:


tests = """

    # basic test

    United Kingdom or Sweden


    # multiple operators at the same precedence level

    United Kingdom or Sweden or France


    # implicit grouping by precedence - 'and' is higher prec than 'or

    United Kingdom or Sweden and People's Republic of China


    # use ()'s to override precedence of 'and' over 'or

    (United Kingdom or Sweden) and People's Republic of China

    """


EXPRESSION.runTests(tests, fullDump=False)

并得到


# basic test

United Kingdom or Sweden

[['United Kingdom', 'or', 'Sweden']]


# multiple operators at the same precedence level

United Kingdom or Sweden or France

[['United Kingdom', 'or', 'Sweden', 'or', 'France']]


# implicit grouping by precedence - 'and' is higher prec than 'or

United Kingdom or Sweden and People's Republic of China

[['United Kingdom', 'or', ['Sweden', 'and', "People's Republic of China"]]]


# use ()'s to override precedence of 'and' over 'or

(United Kingdom or Sweden) and People's Republic of China

[[['United Kingdom', 'or', 'Sweden'], 'and', "People's Republic of China"]]


查看完整回答
反对 回复 2021-05-18
  • 1 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号