私は単純なDSLを実装しています。私が手にどこ文字列内の記号を確認する
def tokenize(txt):
...
return fmt, vars
:私は次の関数を実装する必要が
{
'name': 'John',
'city': 'Paris',
'more': 'xxx',
'data': 'yyy',
...
}
:私は、次の入力文字列を持っている:
txt = 'Hi, my name is <<name>>. I was born in <<city>>.'
をそして私は、次のデータを持っている
fmt = 'Hi, my name is {name}. I was born in {city}.'
vars = ['name', 'city']
つまり、はstr.format()関数に渡すことができ、vars
は検出されたトークンのリストです(データを検索できるようになりました。これはいくつかの名前空間に分割できるため、説明したよりも複雑になります)
、フォーマットを処理することは簡単で、次のようになります。
get_params
はデータの簡単な検索を実行すると、のようなものを返している
def expand(fmt, vars, data):
params = get_params(vars, data)
return fmt.format(params)
:
params = {
'name': 'John',
'city': 'Paris',
}
マイquesti on:
tokenizeを実装するにはどうすればよいですか? delitimersが<<
と>>
であることを知って、どのようにしてトークンを検出できますか? regexesのために行くべきか、それとも簡単な道がありますか?
これはpystache
、または.format
自体がやっていることに似ていますが、私は軽量な実装が欲しいです。この段階では、堅牢性はあまり重要ではありません。
おそらく正規表現を使用できます。 '/ \ <\ <([A-Za-z0-9] +)\> \>/g'のようなものを探してください。これをチェックしてください:https://regex101.com/r/rT8sH9/1 –
@MichaelZhang:ありがとう、偉大な正規表現ヘルパー! – dangonfast
@MichaelZhang - あなたが最初に投稿しました。答えとしてより完全な回答を書きたいので、delavnogはそれを受け入れることができますか? – Prune