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

标签 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)

最佳答案

正如我在评论中提到的,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/

相关文章:

python pyparsing非结构化文本文件

python - Django redis 连接后端或如何实现一个

python - 如何使用 AWS Glue 在 dynamodb 中编写字符串集?

python - 以二叉树方式在pyparsing中解析复杂的逻辑表达式

python - 使用 pyparsing 的这项特定工作的难度? (初学者)

python - 解析器失败 - pyparsing

python - Pyparsing 中的贪婪表达式

python - 使用虚拟 ListCtrl 在 wxpython 中复制并粘贴行

python - 如何返回一个由Python中另一个列表中提取的元素组成的列表?

python - python 中的简单蒙特卡罗模拟