将JSON与正则表达式匹配

2024-04-29 12:44:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个JavaScript文件包含许多对象文本:

// lots of irrelevant code
oneParticularFunction({
    key1: "string value",
    key2: 12345,
    key3: "strings which may contain ({ arbitrary characters })"
});
// more irrelevant code

我需要编写一些Python代码来提取这些文本。在

我的第一次尝试是正则表达式oneParticularFunction\(\{(.*?)\}\);。但如果文本包含“}”,则此操作失败。在

既然我知道对象在一个有效的JavaScript文件中是有效的JSON(匹配的引号、大括号等),有没有更优雅的方法来提取它们呢?在

(换句话说,困难在于删除我不关心的所有其他JavaScript代码。)

编辑:最后,我对不包含子对象的任何对象使用正则表达式。。。在

^{pr2}$

…用手追踪任何有嵌套的东西。在


Tags: 文件of对象代码文本stringvaluecode
3条回答

为什么不编写一个状态机来读取{,并在every{上增加一个计数器,并用every}递减它,所以当它再次达到0时,取中间的所有字符,并使用python中的json解析器来检查它是否有效?这样,您就可以从语法错误中获得好处,而不是从regex中获得简单的match no match(记住python是{免费的,所以不可能出现误报)。在

我可以使用这个方法删除字符串中的所有方括号,而不会消除或不匹配外部的“({”和“})”

while True:
    newstring = re.sub(r'(\(\{.*)\{([^{}]*)\}(.*\}\))', r'\1\2\3', mystring)
    if newstring == mystring:
        break
    mystring = newstring

这里有三组人(我知道,很难说)。第一个是(\(\{.*)。它会找到你的({,然后再找到它后面的任何东西,直到找到最里面的{

我们知道它是最里面的,因为第二组是([^{}]*)。这将匹配不是{}的任何内容。在

{{cd7>找到最里面的东西。在

整个匹配被这三个组重新组合在一起(去掉了{})来代替。它重复这个过程,直到找不到更多匹配的大括号来替换。在

如果还想替换(),可以将其修改为

^{pr2}$

正则表达式代码:

(?<=(?:\s\"))[\s\S]+?(?=\")|(?<=(?:\s))\d+

https://regex101.com/r/bfNkvF/3处的regex的实时示例

要在Python中使用上一个regex,请执行以下操作:

^{pr2}$

我在pythontutor上测试了这段代码,它似乎可以工作。你可以复制并粘贴到那里。告诉我它是否适用于其他对象文本。在

相关问题 更多 >