リスト内のアイテムを操作する一種のマルチレベル正規表現エンジンを構築するために、優れた設計アイデアを探しています。これが背景です。
だから私はリストのリストを持っています、各アイテムは文字列(またはテキスト)として見ることができます、
これらのリストに一致する他の種類のリストが必要であり、正規表現で使用できるようないくつかの演算子がマッチャーとして許可されます。*, *?, +, +?
['this', '*', 'star']
を探しているという意味に基づいてマッチャーを記述できるように'this'
、その後に 0 個または多数の項目が続き、最後に'star'
.
私の質問は、'*'
およびその他の演算子に関するものです。これを行うための正しいpythonic設計は何ですか。これは、の'*'
ように保護を開始したり'\*'
、典型的な問題の処理を開始したりすることなく、実際に検索することもでき\\
ます(ところで、すでにある可能性があります簡単にできるようにパーサーを利用できますか?)
以下のようなグローバル定数を持つこと (つまり、int を値とする const を意味しますが、私のアイテムは文字列/テキスト/再コンパイルされたパターンです) は良い設計アイデアでしょうか? したがって、
['this', MyConst.ZERO_MANY, 'star']
それよりも['this', '*', 'star']
['this', MyConst.ZERO_MANY, 'star', with', '*']
次のようなリストに一致するマッチャーも使用できるようにします。
['this', 'star', with', '*']
['this', 'is', 'with', 'many', 'words', 'before', 'star', 'with', '*']
「*」を両方の意味として直接使用している間、マッチャーのように特別なエスケープが必要になります
['this',
'*', # operator for zero or many
'star',
'with',
'\ *' # some hint to say, this time it is not my operator but searching for item('*')
]`
(このようにすると、リストマッチャーを使用しているときに、最初にアイテムのタイプを確認する必要があります。それがint
その特別な意味を探す場合、これはPythonの生き方ではうまくいかないと思います)
より良い提案はありますか?または、このようにするのは無意味な考えです。もしそうなら、その理由を教えてください。
実際には、マッチャーに使用されるリストは文字列ですが、正規表現でコンパイルされたパターンにすることもでき、アイテム レベルで動作しますが、リスト シーケンス自体として動作していることを表現する方法も必要です。 「他のものよりも先にいくつかのアイテムを持つことを許可しています」と言うことができます
class MyConst:
ZERO_MANY = 1
NON_GREEDY_ZERO_MANY = 2
ONE_MANY = 3
NON_GREEDY_ONE_MANY = 4
よろしくお願いします