如何使用 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 扩展实现了广度优先文件树遍历?

如何使用 POSIX 模块计算 perl 中的时间差?

Linux如何在vi里搜索关键字

解析posix与perl标准的正则表达式区别

如何在 POSIX 函数 send() 中关闭 TCP PSH 标志?

用python编写一个高效搜索代码工具