如何使用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)
答案 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
。)