私はpyparsingを使用しており、次のように2つのアイテムを定義しようとしています:
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
、2 つまたは 3 つのセグメントを含む文字列が取得され、次のようになります。
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
は、常に 2 つのセグメントと 1 つのドット、または上記のように 3 つのセグメント (2 つのドット) を持つ必要があります。ワンセグは不可です。
database_name
1 つのセグメント (データベース) または 2 つのセグメント (user.database) が必要です。
使用のインスタンスはdatabase_name
問題なく動作します - 1 つまたは 2 つのセグメントで一致します。ただし、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 に一致し、テーブル名を表す 3 番目のチャンクを期待しています。しかし、それは私が望むものではありません。
ヘルプ?