如何使用pyparsing只匹配某些字符串?例如,我只想匹配
OneOrMore(Word("Apple")|Word("Ball"))
但是如果绳子是
^{pr2}$然后我想忽略Cat
并返回
['Apple', 'Ball']
我可以用regex实现这一点,但我想知道pyparsing是如何实现的。在
EDIT:"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”、“pplpelplepl”,以及由“A”、“p”、“l”和“e”组成的另一个单词。在这种情况下,我认为最好使用Keyword
。在最好从一些示例字符串开始:
^{1}$既然你知道你想要“Apple”和“Ball”,但也可能有其他的混入其中,那么你可以尝试为“anythise”定义一个表达式。现在
^{pr2}$Word
可以使用,因为我们想要匹配任何包含非空格字符的单词组(使用pyparsing的printables
字符串)。在由于您希望从解析的输出中抑制这些其他单词,所以在创建这个catch all表达式时,我们添加了
.suppress()
调用。在现在这将匹配任何非空白字符组,包括“Apple”和“Ball”。为了避免意外地删除我们想要的单词,我们使用了“|”运算符(正如您在原始文章中所做的那样),并确保
anything_else
是最后一个列出的。也就是说,将首先测试所有其他选项,并且只有当我们没有匹配到其中任何一个选项时,我们才会达到anything_else
的全部功能。在现在您的扫描仪表达式可以读取:
并使用以下方法对样本进行测试:
你应该只拿回你输出的苹果和球。在
(请注意,
Keyword
区分大小写。如果您还想匹配“apple”和“ball”或“apple”或“ball”,请使用CaselessKeyword
。)相关问题 更多 >
编程相关推荐