我应该解析令牌的文件。令牌可以是由字母数字字符组成的字符串,第一个字符是字母。
在下面的例子中,我想看到以下标记(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
答案 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 + '_')