如何使用 Python 或 posix 工具搜索和替换字符串中的匹配括号
Posted
技术标签:
【中文标题】如何使用 Python 或 posix 工具搜索和替换字符串中的匹配括号【英文标题】:How to search and replace matching brackets in a string using Python or posix tools 【发布时间】:2021-08-14 16:05:54 【问题描述】:我有一个包含“某种 Python/JSON 可解析”数据的大文件(即对我来说可以快速破解):
"A":
"foo": "bar"
..我想将其转换为可在 Python 中使用的有效可解析文本(可以是 Python、JSON、..)。
(注意:上面的sn-p 可以被Python解析,但它不是一个有效的数据结构,因为set()
必须包含可散列的元素)
将"A"
后面的花括号变成方括号会将"A"
变成list
,这对我来说没问题。
我的第一种方法是搜索并替换某些大括号以使其有效 Python:
"A": \(properly braced subtext)\
-> "A": \[\1\]
导致:
"A": [
"foo": "bar"
]
但是当 可以是
和
之间的子字符串的一部分时,我将如何搜索和替换
..
-> [ .. ]
? (使用常用工具,如awk
或 Pythons re
)
注意:这听起来类似于this question,但答案无法识别匹配的括号。
【问题讨论】:
修复格式错误的数据通常需要修补解析器。我不确定正则表达式是否应该用于诸如任务之类的工具。编写通用解决方案可能需要一段时间。从您的(大!)文件中添加更多样本会很好 @frans 你能再提供几个畸形 json 数据的例子吗? 【参考方案1】:快速建议,伪代码:
遍历文本中的每个字符 如果找到 ,则将 1 添加到变量 bracketcounter 如果找到 ,并且括号计数器为 1,则您已找到匹配的括号 如果找到 ,并且括号计数器大于 1,则减去 1 括号计数器 如果找到 ,并且括号计数器小于 1, 不匹配 如果文本结束且括号计数器不为 0,则其中也可能存在不匹配【讨论】:
如果键或值包含
或
怎么办?
这是一个有效的点,可以通过完全语法感知的搜索/替换机制来解决,但幸运的是我没有这个问题以上是关于如何使用 Python 或 posix 工具搜索和替换字符串中的匹配括号的主要内容,如果未能解决你的问题,请参考以下文章
是否有任何 POSIX 函数或 glibc 扩展实现了广度优先文件树遍历?