我需要找到一个正则表达式来断言JSON对象中某些键的存在。
示例,假设我有一个像这样的JSON对象
{"key1": {...}, "key2": [...], "key3": "some id", "key4": "irrelevant"}
我需要一个正则表达式来断言,例如,其中有 key1 , key2 和 key3 。
请注意,在JSON中,元素的顺序无关紧要。
我一直在网上搜索,包括此处的stackoverflow,唯一看来可以解决我问题的解决方案是
^(?=.*\bkey1\b)(?=.*\bkey2\b)(?=.*\bkey3\b).*$
提供了here,但它对我不起作用。它与我的JSON对象中的任何内容都不匹配。
有人知道为什么吗?有更好的解决方案吗?
谢谢
答案 0 :(得分:0)
正则表达式不是执行此类任务的理想选择,但是正如您在评论中提到的那样,您只需要一个正则表达式解决方案,就需要将正则表达式更正为此类,
^(?=.*"key1":)(?=.*"key2":)(?=.*"key3":).*$
您的前瞻(?=.*\bkey1\b)
将允许匹配key1
在文本中的任何位置(包括值),因为它不会强制将它们用作键。
但是由于键被双引号引起来,并且后跟冒号,因此我使用了(?=.*"key1":)
。另外,如果您认为"
和:
之间可以有空格,请修改上面的正则表达式以照顾可选的空格并将其写为
^(?=.*"key1"\s*:)(?=.*"key2"\s*:)(?=.*"key3"\s*:).*$
答案 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", >