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

2024-10-06 23:33:53 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: 字符串applepyparsingeditregexcatwordpattern
1条回答
网友
1楼 · 发布于 2024-10-06 23:33:53

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

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

^{1}$

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

^{pr2}$

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

anything_else = Word(printables).suppress()

现在这将匹配任何非空白字符组,包括“Apple”和“Ball”。为了避免意外地删除我们想要的单词,我们使用了“|”运算符(正如您在原始文章中所做的那样),并确保anything_else是最后一个列出的。也就是说,将首先测试所有其他选项,并且只有当我们没有匹配到其中任何一个选项时,我们才会达到anything_else的全部功能。在

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

pattern = OneOrMore(APPLE | BALL | anything_else)

并使用以下方法对样本进行测试:

pattern.runTests(samples)

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

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

相关问题 更多 >