我正在使用 pyparsing 并尝试定义如下两项:
identifier = Word(alphas, alphanums).setName('identifier)
database_name = Optional(identifier.setResultsName('user') + Suppress('.')) + identifier.setResultsName('database')
table_name = database_name + Suppress('.') + identifier.setResultsName('table')
这个想法是匹配table_name
,它将采用一个包含两个或三个段的字符串,并产生以下结果:
mark.foo.bar
=> tokens.user = 'mark'
tokens.database = 'foo'
tokens.table = 'bar'
或者如果第一段丢失:
foo.bar
=> tokens.user = '' #anything is acceptable: none, empty string or just plain missing
tokens.database = 'foo'
tokens.table = 'bar'
table_name
应该总是有两个段和一个点,或三个段(两个点)如上。一段是不可接受的。
database_name
应该有一个段(数据库)或两个(user.database)。
使用的实例可以database_name
正常工作 - 它会匹配一个或两个段。但是,table_name
在某些情况下会失败:
# Works for three segments
mark.foo.bar
=> tokens.user = 'mark'
tokens.database = 'foo'
tokens.table = 'bar'
# Fails for two
foo.bar
=> Expected "." (at char 7), (line:1m col:8)
我可以看到它在做什么:foo.bar
已与 user.database 匹配,现在它正在期待代表表名的第三个块。然而它不是我想要的。
帮助?