【发布时间】:2013-08-11 15:24:02
【问题描述】:
我想要一种紧凑的方法来解析以强制列表元素(未指定的数字)开头并使用= 以类似字典的定义结尾的单行字符串。
-
element-separator 应该是
,并且 spaces 应该成为元素的一部分——我认为这排除了shlex。 - 空格应该/可以在开始和结束(引号)
- 如果元素包含
,,则用户需要引用"-
"key=value,with,comma" - 或
key="value,with,comma"-- 任何更容易实现的方法
-
- 错误的引用或包含引号字符的元素可以有未定义的行为。
- 双键的行为也未定义。
- 如果可以大大简化实现,则可以稍作改动。
让我们调用函数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,我不知道该怎么处理这些。不过,我不确定 Regular Expressions 是否能解决这个问题。我认为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...
【问题讨论】:
-
你说元素分隔符应该是
,,但你的第三个例子似乎暗示;也应该是一个分隔符。 -
@DSM 哎呀。我自己尝试的剩余物。已更正。谢谢
-
如果有人想看看我如何集成提出的解决方案和一些演示,我把它们放在pastebin.com/BnyC48yH