如何使用python在文本中查找JSON对象

如何使用python在文本中查找JSON对象,python,json,regex,Python,Json,Regex,我试图用python正则表达式从文本解析JSON对象。我找到了这个匹配项: '\{(?:[^{}]|(?R))*\}' 但在python中,我得到了以下错误: re.error: unknown extension ?R at position 12 请参阅中的正则表达式匹配。Thas是因为pythonre模块非常弱,不支持子例程和递归。请尝试使用regex模块。它将编译您的正则表达式。您发现一个正则表达式使用Python标准库re模块不支持的语法 当您查看regex101链接时,您将看到该

我试图用python正则表达式从文本解析JSON对象。我找到了这个匹配项:

'\{(?:[^{}]|(?R))*\}'
但在python中,我得到了以下错误:

re.error: unknown extension ?R at position 12

请参阅中的正则表达式匹配。

Thas是因为python
re
模块非常弱,不支持子例程和递归。请尝试使用
regex
模块。它将编译您的正则表达式。

您发现一个正则表达式使用Python标准库
re
模块不支持的语法

当您查看regex101链接时,您将看到该模式在使用时有效,并且引发错误的有问题的
(?R)
语法使用了一个名为的功能。该功能仅由一个

您可以安装另一个Python正则表达式引擎,它明确支持该语法:

>>> import regex
>>> pattern = regex.compile(r'\{(?:[^{}]|(?R))*\}')
>>> pattern.findall('''\
... This is a funny text about stuff,
... look at this product {"action":"product","options":{...}}.
... More Text is to come and another JSON string
... {"action":"review","options":{...}}
... ''')
['{"action":"product","options":{...}}', '{"action":"review","options":{...}}']
另一个选项是使用;see尝试解码以
{
开头的任何部分,以获取示例方法。虽然递归正则表达式可以找到类似JSON的文本,但解码器方法将允许您仅提取有效的JSON文本

下面是一个生成器函数,它可以实现以下功能:

from json import JSONDecoder

def extract_json_objects(text, decoder=JSONDecoder()):
    """Find JSON objects in text, and yield the decoded JSON data

    Does not attempt to look for JSON arrays, text, or other JSON types outside
    of a parent JSON object.

    """
    pos = 0
    while True:
        match = text.find('{', pos)
        if match == -1:
            break
        try:
            result, index = decoder.raw_decode(text[match:])
            yield result
            pos = match + index
        except ValueError:
            pos = match + 1
演示:


如果一行中只有一个JSON,可以使用index方法查找第一个和最后一个括号来选择JSON:

firstValue = jsonString.index("{")
lastValue = len(jsonString) - jsonString[::-1].index("}")
jsonString = jsonStringEncoded[firstValue:lastValue]

这是因为Python正则表达式解析器不支持这种语法。所有引擎都不支持通用正则表达式语法标准。一句话:不要只是从随机位置复制正则表达式模式,并期望它们在随机正则表达式引擎中工作。至少,在中支持递归,如果需要,其他语言需要使用第三方库可用。什么是“PCRE级别”?
regex
没有任何地方声称与PCRE兼容(功能或语法方面)。但它支持PCRE@MartijnPieters好的,改变了。但是我看不出有什么理由投反对票。我为这个问题提出了一个有效的解决方案。非常感谢。我使用了“regex”模块,现在它可以工作了;)很高兴能提供帮助!如果你觉得它对你有用,请随意。:-)如果有用,我会用弗兰肯斯坦
extract_json_objects()
还提供周围的文本,以便用户可以选择用json美化对象以及包含对象的字符串。
firstValue = jsonString.index("{")
lastValue = len(jsonString) - jsonString[::-1].index("}")
jsonString = jsonStringEncoded[firstValue:lastValue]