pyparsing定义关键字比较Literal、Word、Keyword和Combin

2024-04-29 16:10:02 发布

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

我有和here (nested function calls)一样的问题

我还想把函子限制为许多给定单词(a,b,c)中的一个

所以法律是:

a(dd, ee)
b(a(1)) 

但不是:

^{pr2}$

我可以使用以下方法之一实现:

functor1 = Literal('a') | Literal('b') | Literal('c')
functor2 = Word('a') | Word('b') | Word('c')
functor3 = Keyword('a') | Keyword('b') | Keyword('c')
functor4 = Combine(Keyword('a') | Keyword('b') | Keyword('c'))

第一个很简单,但rest对我来说太模糊了(尤其是当Word有param asKeyword,但它的代码不使用Keyword类,反之亦然)。在

请比较一下。在

OR列表是否作为联合收割机工作?在


Tags: 方法herefunction单词keywordddeeword
1条回答
网友
1楼 · 发布于 2024-04-29 16:10:02

下面是一些用于比较pyparsing表达式的测试代码。在

from pyparsing import *

functor1 = Literal('a') | Literal('b') | Literal('c')
functor2 = Word('a') | Word('b') | Word('c')
functor3 = Keyword('a') | Keyword('b') | Keyword('c')
functor4 = Combine(Keyword('a') | Keyword('b') | Keyword('c'))

functor1.setName("Literal('a') | Literal('b') | Literal('c')")
functor2.setName("Word('a') | Word('b') | Word('c')")
functor3.setName("Keyword('a') | Keyword('b') | Keyword('c')")
functor4.setName("Combine(Keyword('a') | Keyword('b') | Keyword('c'))")
functors = [functor1, functor2, functor3, functor4]

tests = "a b c aaa bbb ccc after before".split()
for func in functors:
    print func
    for t in tests:
        try:
            print t, ':', func.parseString(t)
        except ParseException as pe:
            print pe
    print

印刷品:

^{pr2}$

您应该能够进行以下观察:

  • Literal将匹配给定字符串,即使它只是 一根更大的绳子。

  • Word将匹配一组字符 由其构造函数字符串中的字母组成。

  • Keyword将 仅当给定字符串不是较大单词的一部分时才匹配它 (后跟空格或非单词字符)

  • Combine没有 在这个例子中什么都可以做。

Combine的目的是将多个匹配标记合并到一个字符串中。例如,如果您将社会保险号定义为:

Word(nums,exact=3) + '-' + Word(nums,exact=2) + '-' + Word(nums,exact=4)

然后分析“555-66-7777”将得到

['555', '-', '66', '-', '7777']

您很可能希望将其作为单个字符串,因此通过将解析器表达式包装在Combine中来组合结果:

Combine(Word(nums,exact=3) + '-' + Word(nums,exact=2) + '-' + Word(nums,exact=4))

['555-66-7777']

相关问题 更多 >