匹配特定字符串,忽略其他字符串

时间:2017-02-27 03:29:18

标签: python pyparsing

如何使用pyparsing匹配某些字符串?例如,我想只匹配

OneOrMore(Word("Apple")|Word("Ball"))

但如果字符串是

"Apple Ball Cat"

然后我想忽略Cat并取回

['Apple', 'Ball']

我可以使用正则表达式执行此操作,但我想知道它是如何通过pyparsing完成的。

编辑:"Apple Cat Ball"也应该提供['Apple', 'Ball']

我试过了

correct = Word("Apple")|Word("Ball")
pattern = OneOrMore(~vulnTypes.suppress() + vulnTypes)
result = pattern.parseString(string)

1 个答案:

答案 0 :(得分:1)

正如我在评论中提到的,Word并不是用于匹配特定单词的类 - 它工作,但它也会接受很多其他单词。原因是Word接受包含当前表达式中允许的字符的字符串,并且将匹配包含该字符串中的一个或多个字符的任何单词组。例如,您可以使用Word("0123456789")解析任何整数。 Word("Apple")肯定会匹配“Apple”,但它也会匹配“AAAA”,“pplplpelplepl”,以及由字符“A”,“p”,“l”和“e”组成的另一个单词。在这种情况下,我认为您最好使用Keyword

最好从一些示例字符串开始:

samples = """\
    Apple
    Apple Ball
    Ball Apple
    Apple Cat
    Apple Cat Ball Daisy Ball"""

APPLE = Keyword("Apple")
BALL = Keyword("Ball")

既然你知道你想要“Apple”和“Ball”,但可能还有其他人混在一起,那么你可以尝试为“其他任何东西”定义一个表达式。现在使用Word是有意义的,因为我们希望匹配任何包含任何非空格字符的单词组(使用pyparsing的printables字符串)。

anything_else = Word(printables)

由于您希望从解析的输出中抑制这些其他单词,因此我们在创建此catch-all表达式时添加.suppress()调用。

anything_else = Word(printables).suppress()

现在,这将匹配任何组的非空白字符,包括“Apple”和“Ball”。为避免意外丢弃我们想要的单词,我们使用'|'运算符(正如您在原始帖子中所做的那样),并确保列出anything_else last 。也就是说,所有其他选项将首先进行测试,如果我们不匹配任何选项,我们只会到达anything_else全部。{/ p>

现在您的扫描仪表达式可以读取:

pattern = OneOrMore(APPLE | BALL | anything_else)

使用以下方法对您的样本进行操作:

pattern.runTests(samples)

你应该只在你的输出中找回苹果和球。

(请注意,Keyword区分大小写。如果您还想匹配“apple”和“ball”或“APPLE”或“BALL”,请使用CaselessKeyword。)