我想提供一个函数,它采用逗号分隔的字符串并将其拆分为分隔符,类似于
str.split()
但保留(可能嵌套)引用和括号部分。
示例包括逗号分隔的键值对 (a=b,c=d
),还包括逗号分隔的 shell 命令,其中可能包含分隔符,甚至可以用来编写简单正则表达式的引号字符。
为了避免编写成熟的解析器,我的第一个想法是使用
csv
模块(请参阅如何使用 csv 模块处理字段值内的双引号?),但即使对于简单的情况,我也无法使用它,例如:
>>> s = "a='[1,2,3]',c=d"
>>> list(csv.reader([s], delimiter=',', quotechar="'")) # expected: ["a='[1,2,3]'", "c=d"]
[["a='[1", '2', "3]'", 'c=d']]
而且我没有尝试像
a='[1,"3,14",3]',c="[4,5,6]"
这样更复杂的东西。
有没有一种简单的方法可以驯服
csv.reader
将上面的字符串拆分为 ['a=..', 'c=..']
或者甚至更好地使用一些内置的字符串处理功能?
好吧,对于你的特定数据,你可以作弊一点,因为如果你眯着眼睛看,它看起来就像 Python 调用的 kwargs 的样子,所以将它包装在调用表达式中并解析 AST。
import ast
target = """
a='[1,"3,14",3]',c="[4,5,6]"
"""
tree = ast.parse(f"XXX({target.strip()})", "...", "eval")
print({kw.arg: ast.unparse(kw.value) for kw in tree.body.keywords})
打印出来
{'a': '\'[1,"3,14",3]\'', 'c': "'[4,5,6]'"}