我想要一种紧凑的方法来解析以强制性列表元素(未指定的数字)开头并以类似字典的定义结尾的单行字符串=
。
- 元素分隔符应该是
,
,空格应该成为元素的一部分——我认为这排除了shlex
。 - 空格应该/可以在开头和结尾被剥离(引号也是)
- 如果一个元素将包含一个
,
用户需要引用"
- 任何一个
"key=value,with,comma"
- 或者
key="value,with,comma"
——更容易实现的
- 任何一个
- 引用错误或包含引号字符的元素有未定义的行为是可以的。
- 双键的行为也是未定义的。
- 如果它大大简化了实现,则可以稍微改变一下。
让我们调用函数opts
并让它返回 alist
和 a 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
,我看不出我应该如何处理这些。不过,我不确定正则表达式是否能解决这个问题。我认为语法有点太严格了。照原样,如果我更喜欢一点(因为它解析 python ;-))optparse
configparser
json
eval
我的手动解决方案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...