如何使用正则表达式在JSON中声明多个键的存在?

时间:2019-03-28 13:32:26

标签: json regex

我需要找到一个正则表达式来断言JSON对象中某些键的存在。

示例,假设我有一个像这样的JSON对象

{"key1": {...}, "key2": [...], "key3": "some id", "key4": "irrelevant"}

我需要一个正则表达式来断言,例如,其中有 key1 key2 key3

请注意,在JSON中,元素的顺序无关紧要。

我一直在网上搜索,包括此处的stackoverflow,唯一看来可以解决我问题的解决方案是

^(?=.*\bkey1\b)(?=.*\bkey2\b)(?=.*\bkey3\b).*$

提供了here,但它对我不起作用。它与我的JSON对象中的任何内容都不匹配。

有人知道为什么吗?有更好的解决方案吗?

谢谢

4 个答案:

答案 0 :(得分:0)

正则表达式不是执行此类任务的理想选择,但是正如您在评论中提到的那样,您只需要一个正则表达式解决方案,就需要将正则表达式更正为此类,

^(?=.*"key1":)(?=.*"key2":)(?=.*"key3":).*$

您的前瞻(?=.*\bkey1\b)将允许匹配key1在文本中的任何位置(包括值),因为它不会强制将它们用作键。

但是由于键被双引号引起来,并且后跟冒号,因此我使用了(?=.*"key1":)。另外,如果您认为":之间可以有空格,请修改上面的正则表达式以照顾可选的空格并将其写为

^(?=.*"key1"\s*:)(?=.*"key2"\s*:)(?=.*"key3"\s*:).*$

Check this demo

答案 1 :(得分:0)

您可以只检查字典中是否存在键:

import json

json_string = '{ "key1": "some id", "key2": "some id", "key3": "some id", "key4": "irrelevant" }'

# Deserialize the JSON string into a Python dictionary  
deserialized_dict = json.loads(json_string)

# Check if Key1, Key2, Key3 keys exist in the dictionary or not
if "key1" and "key2" and "key3" in deserialized_dict:
    print ("All keys are present")
else:
    print ("Keys are absent")

答案 2 :(得分:0)

编辑:哦,我看到您删除了Python标记

编辑:

即使键中有空格,这也应该抓住它们

(\"[^,]+?\")[\s]*:

无论哪种方式,请尝试尝试这些方法以查看它们是否输出键(但请记住,这些键用于不包含空格的键)

(\"[\S]+\")[\s]*:

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

我认为@“ Kunal Mukherjee”是最好的解决方案。

如果您想在不事先知道密钥名称的情况下找到当前密钥,这可能会帮助提供您不希望密钥具有空间的功能

>>> import re

>>> string = '''{"key1": {...}, "key2": [...], "key3": "some id", "key4": "irrelevant"}'''



#OUTPUT
>>> re.findall('(\"[^,]+?\")[\s]*:', string)
['"key1"', '"key2"', '"key3"', '"key4"']



#OUTPUT
>>> re.findall('(\"[\S]+?\")[\s]*:', string)
['"key1"', '"key2"', '"key3"', '"key4"']



#OUTPUT
>>> re.findall('(?:(?<=\")([\S]+?)\")[\s]*:', string)
['key1', 'key2', 'key3', 'key4']

答案 3 :(得分:0)

我知道您不需要Python代码,但是我包含了一个有效的regex语句,并使用Python对其进行了测试。假设您只关心key1,key2, key3是否在JSON中,则可以使用以下模式:

'"key1":.+"key2":.+"key3":.+'

具体细节将取决于您的用例(例如,如果您有{"my_key": {"key3": [...]}},则可能要根据是否认为嵌套键有效来调整模式)。但是,它可以与您给出的示例一起使用。

作为Python代码:

import re

pattern = re.compile(r'"key1":.+"key2":.+"key3":.+')

my_dict_str = r'{"key1": {...}, "key2": [...], "key3": "some id", "key4": "irrelevant"}'

print(pattern.search(my_dict_str))

输出

<re.Match object; span=(1, 71), match='"key1": {...}, "key2": [...], "key3": "some id", >