如何使用 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)
最佳答案
正如我在评论中提到的,Word
并不是真正用于匹配特定单词的类 - 它会工作,但它也接受很多其他话也。原因是 Word
接受一个包含当前表达式中允许的字符的字符串,并将匹配包含该字符串中一个或多个任何字符的任何单词组。例如,您可以使用 Word("0123456789")
解析任何整数。 Word("Apple")
肯定会匹配“Apple”,但它也会匹配“AAAA”、“pplplpelplepl”以及另一个由字符“A”、“p”、“组成的单词” l”和“e”。在这种情况下,我认为您最好使用关键字
。
最好从一些示例字符串开始:
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)
由于您希望从解析的输出中抑制这些其他单词,因此我们在创建此包罗万象的表达式时添加 .suppress()
调用。
anything_else = Word(printables).suppress()
现在,这将匹配任何组非空白字符,包括“Apple”和“Ball”。为了避免意外丢失我们想要的单词之一,我们使用“|”运算符(正如您在原始帖子中所做的那样),并确保 anything_else
列在最后。也就是说,所有其他选项将首先被测试,如果我们没有匹配任何一个选项,我们只会到达 anything_else
包罗万象。
现在您的扫描仪表达式可以读取:
pattern = OneOrMore(APPLE | BALL | anything_else)
并使用以下命令针对您的样本运行它:
pattern.runTests(samples)
并且您应该只返回输出中的苹果和球。
(请注意,关键字
区分大小写。如果您还想匹配“apple”和“ball”或“APPLE”或“BALL”,请使用CaselessKeyword
.)
关于python - 匹配特定字符串,忽略其他字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42477379/