【发布时间】:2013-07-31 02:32:12
【问题描述】:
假设我在 Python 中定义了一个字符串,如下所示:
my_string = "something{name1, name2, opt1=2, opt2=text}, something_else{name3, opt1=58}"
我想在 Python 中解析该字符串,以便我可以索引语言的不同结构。
例如,输出可以是字典parsing_result,它允许我以结构化方式索引不同的元素。
例如:
parsing_result['names']
将持有 list 的字符串:['name1', 'name2']
而parsing_result['options'] 会保存一本字典,这样:
-
parsing_result['something']['options']['opt2']保存字符串"text" -
parsing_result['something_else']['options']['opt1']保存字符串"58"
我的第一个问题是:如何在 Python 中解决这个问题?是否有任何库可以简化此任务?
对于一个工作示例,我不一定对解析我上面定义的确切语法的解决方案感兴趣(尽管那会很棒),但任何接近它的东西都会很棒。
更新
看起来一般正确的解决方案是使用解析器和词法分析器,例如ply(谢谢@Joran),但文档有点吓人。当语法轻量级时,有没有更简单的方法来完成这项工作?
-
我发现this thread 提供了以下正则表达式来围绕外部逗号分割字符串:
r = re.compile(r'(?:[^,(]|\([^)]*\))+') r.findall(s)但这是假设分组字符是
()(而不是{})。我正在尝试适应这一点,但这看起来并不容易。
【问题讨论】:
-
你需要一个解析器和一个词法分析器……试试 ply for python(我经常使用的那个……)……定义一门语言的工作量很大
-
如果语言足够轻量,可以使用正则表达式。我相信你的例子所暗示的语言就是这样的语言。
-
如果你的语言中的句子也是Python中的句子,你可以使用
ast.parse()。 -
我很好奇这只是一个练习,还是你想实现一个更大的目标?
-
@aglassman。我必须处理其他人定义的这种特定语言。展望未来,我想学习解析我自己的单行语言。