這裏是一些用於比較你的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
打印:
Literal('a') | Literal('b') | Literal('c')
a : ['a']
b : ['b']
c : ['c']
aaa : ['a']
bbb : ['b']
ccc : ['c']
after : ['a']
before : ['b']
Word('a') | Word('b') | Word('c')
a : ['a']
b : ['b']
c : ['c']
aaa : ['aaa']
bbb : ['bbb']
ccc : ['ccc']
after : ['a']
before : ['b']
Keyword('a') | Keyword('b') | Keyword('c')
a : ['a']
b : ['b']
c : ['c']
aaa : Expected "a" (at char 0), (line:1, col:1)
bbb : Expected "a" (at char 0), (line:1, col:1)
ccc : Expected "a" (at char 0), (line:1, col:1)
after : Expected "a" (at char 0), (line:1, col:1)
before : Expected "a" (at char 0), (line:1, col:1)
Combine(Keyword('a') | Keyword('b') | Keyword('c'))
a : ['a']
b : ['b']
c : ['c']
aaa : Expected "a" (at char 0), (line:1, col:1)
bbb : Expected "a" (at char 0), (line:1, col:1)
ccc : Expected "a" (at char 0), (line:1, col:1)
after : Expected "a" (at char 0), (line:1, col:1)
before : Expected "a" (at char 0), (line:1, col:1)
你應該能夠使這些意見:
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']