Как утверждать наличие нескольких ключей в JSON с регулярным выражением? - PullRequest
0 голосов
/ 28 марта 2019

Мне нужно найти регулярное выражение для подтверждения наличия определенных ключей в объекте JSON.

Пример, скажем, у меня есть объект JSON, подобный этому

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

Мне нужно регулярное выражение, которое утверждает, что, например, key1 , key2 и key3 .

Обратите внимание, что в JSON порядок элементов не имеет значения.

Я искал в Интернете, в том числе здесь, на stackoverflow, и единственное решение, которое могло бы решить мою проблему, было это

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

при условии здесь , но у меня это не работает. В моем объекте JSON ничего не совпадает.

Кто-нибудь знает почему? Есть ли лучшее решение?

Спасибо

Ответы [ 4 ]

0 голосов
/ 28 марта 2019

Я знаю, что вам не нужен код Python, но я включил рабочее выражение регулярного выражения и использовал Python для его проверки. Предполагая, что вы заботитесь только о том, есть ли в вашем JSON ключи key1, key2, и key3, вы можете использовать следующий шаблон:

'"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", >
0 голосов
/ 28 марта 2019

Вы можете просто проверить, существуют ли ключи в словаре или нет:

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")
0 голосов
/ 28 марта 2019

РЕДАКТИРОВАТЬ: О, я вижу, что вы удалили тег Python сейчас

.

EDIT:

Это должно захватывать их, даже если в клавишах есть пробелы

(\"[^,]+?\")[\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']
0 голосов
/ 28 марта 2019

Регулярное выражение не является хорошим выбором для такого рода задач, но, как вы упомянули в своих комментариях, что вам нужно только решение регулярного выражения, вам нужно исправить свое регулярное выражение, чтобы оно было примерно таким,

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

Ваши предпросмотры (?=.*\bkey1\b) позволят сопоставлять key1 в любом месте текста, включая значение, из-за которого он не будет применять их в качестве ключей.

Но так как ключи заключены в двойные кавычки и сопровождаются двоеточиемследовательно, я использовал (?=.*"key1":).Также, если вы считаете, что между " и : может быть пробел, измените приведенное выше регулярное выражение, чтобы учесть дополнительные пробелы, и запишите его как

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

Проверьтеэто демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...