排除预定义关键字列表中的标记定义

时间:2013-05-29 22:24:52

标签: token pyparsing

我应该解析令牌的文件。令牌可以是由字母数字字符组成的字符串,第一个字符是字母。

在下面的例子中,我想看到以下标记(zoo,abcd,moo,pqr,join6)

我的代码如下所示

#!/usr/bin/env python
from pyparsing import *

reserved_words = ( Keyword('JOIN') | Keyword('ON'))
identifier = Combine(Word(alphas, exact=1) + Optional(Word(alphanums + '_')))
token = ~reserved_words + identifier

txt = """
JOIN zoo ON abcd JOIN
moo ON join6;"""

for token, start, end in token.scanString(txt):
    print token, start, end

我看到的输出是:

['OIN'] 2 5
['zoo'] 5 9
['N'] 11 12
['abcd'] 12 17   
['OIN'] 19 22
['moo'] 22 26
['N'] 28 29
['join6'] 29 35

我将不胜感激。

附加示例:

我必须解析SQL这样的语言,其中包含JOIN,ON,AS等关键字。我按照你的建议改变了“table”的定义。在AS之后使用关键字“AS”以及别名标识符是可选的。对于“txt”中的第二行,不使用“AS”和“别名”-ing标识符。但我得到的输出如下。我不明白为什么会这样。

#!/usr/bin/env python
from pyparsing import *

join_kw , on_kw, as_kw = map(lambda x: Keyword(x, caseless=True), ['JOIN' , 'ON', 'AS'])
reserved_words = ( join_kw | on_kw | as_kw)
identifier = Combine(Word(alphas, exact=1) + Optional(Word(alphanums + '_')))
table = (reserved_words.suppress() | identifier) 
stmt = join_kw + table + Optional(as_kw) + Optional(identifier) + on_kw
txt = """
JOIN zoo AS t ON abcd 
JOIN moo ON join6;"""

for token, start, end in stmt.scanString(txt):
    if len(token) != 0:  
        print token, start, end

['JOIN', 'zoo', 'AS', 't', 'ON'] 1 17

1 个答案:

答案 0 :(得分:2)

scanString用于通过输入字符串扫描匹配。逐字逐句进行扫描。在位置1,它尝试匹配token,并且失败,因为JOIN是保留字,因此NotAny前瞻失败。然后scanString前进到位置2.OIN是一个完全有效的令牌,因此报告为匹配。

如果您只想要令牌并希望scanString跳过关键字,请使用:

for token, start, end in (reserved_words.suppress() | token).scanString(txt):

或者使用parseString而不是scanString:

for item in ZeroOrMore(reserved_words|token).parseString(txt):

此外,Word有一个2参数初始值设定项,可以简化标识符的定义:

identifier = Word(alphas, alphanums + '_')