关于引号和括号,仅在“顶层”拆分字符串的直接方法是什么?

问题描述 投票:0回答:1

我想提供一个函数,它采用逗号分隔的字符串并将其拆分为分隔符,类似于

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 csv parsing split
1个回答
1
投票

好吧,对于你的特定数据,你可以作弊一点,因为如果你眯着眼睛看,它看起来就像 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]'"}
© www.soinside.com 2019 - 2024. All rights reserved.