必須のリスト要素 (不特定の数) で始まり、=
.
- element-separatorは要素の一部である必要が
,
あり、スペースは要素の一部になる必要があります-これは除外されるshlex
と思います。 - 先頭と末尾のスペースは削除する必要があります(引用符も)
- 要素に が含まれる場合
,
、ユーザーは引用する必要があります"
- また
"key=value,with,comma"
- または
key="value,with,comma"
-- 実装がより簡単なもの
- また
- 間違った引用符や引用文字を含む要素で未定義の動作が発生しても問題ありません。
- 二重キーの動作も未定義です。
- 実装が大幅に簡素化される場合は、これを少し変更しても問題ありません。
関数を呼び出して、 aと aをopts
返すようにしましょう。list
dict
以下に、いくつかの入力例と望ましい結果を示します。
opts('dog,cat') # -> ["dog", "cat"], {}
opts('big fish,cat') # -> ["big fish", "cat"], {}
opts('"a dog, a cat",a fish') # -> ["a dog, a cat", "a fish"], {}
opts('key=value') # -> [] {'key':'value'}
opts('key=the value,x=y') # -> [] {'key':'the value', 'x':'y'}
opts('dog, big fish, eats="any, but peas", flies = no! '
# -> ['dog','big fish'], {'eats':'any, but peas', 'flies':'no!' }
shlex
、argparse
、optparse
および を無視configparser
しました。これらをどう処理すればよいかわかりません。ただし、正規表現がこの問題を解決するかどうかはわかりません。json
構文が少し厳しすぎると思います。eval
そのまま、もう少し私の好みに合わせれば(Pythonを解析するため;-) )
私の手動ソリューションmacro
はあまり柔軟ではなく、そのパラメーター処理をopts(s)
上記のより一般的な関数に置き換えたいと考えています。
def macro(s):
kw = { 'see':u"\\see", 'type':u"Chapter", 'title': u'??' }
params = s.split(",")
kw['label'] = params[0]
if len(params) > 1: # very inflexible
kw['title'] = params[1]
for param in params[2:]: # wrong if p[1] is already key=value
key, value = param.split("=",1) # doesn't handle anything, too simple
kw[key] = value
# ...rest of code...
目標は、再利用可能な関数opts
をここで使用することです。
def macro_see(s):
ls, kw = opts(s)
# ...rest of code...