Как извлечь конкретный словарь на основе определенных ключей с помощью регулярного выражения?

#python #regex #text-processing

#python #регулярное выражение #обработка текста

Вопрос:

У меня есть данные в виде словарей с количеством пар ключ-значение, различным в каждом словаре. Я пытаюсь извлечь только определенные словари на основе определенных ключей (извлекать только те словари, которые имеют ключи «A», «B» и «C», не больше и не меньше).

Я попробовал этот код:

 import re
pattern = re.compile(r'({"A":(.*?),"B":(.*?),"C":(.*)})')
test_str = {"A":2.3,"B":3,"C":2.9},{"A":2.1,"B":33,"C":1.2,"D":9,"F":3.4},{"A":1.4,"B":3.3,"C":1.6,"G":3.2,"K":4},
        {"A":4.3,"B":11,"C":93}
for match in re.findall(pattern, test_str):
print(match)
  

Похоже, это не работает.

Ввод:

 {"A":2.3,"B":3,"C":2.9},{"A":2.1,"B":33,"C":1.2,"D":9,"F":3.4},{"A":1.4,"B":3.3,"C":1.6,"G":3.2,"K":4},
        {"A":4.3,"B":11,"C":93}
  

Ожидаемый результат:

 {"A":2.3,"B":3,"C":2.9},{"A":4.3,"B":11,"C":93}
  

Комментарии:

1. Почему вы пытаетесь сделать это с помощью регулярного выражения ?! Ваш test_str не выглядит как строка, это кортеж словарей. Если это JSON, проанализируйте его; это гораздо более простая операция для выполнения с последовательностью словарей, чем со строкой, вы можете просто выполнить, например set(d.keys()) == {"a", "b", "c"} .

2. Здесь тот же вопрос: мы говорим о строке со списком словарей типа python или о списке словарей?

3. @jonrsharpe Я не думаю, что это set необходимо, поскольку ключи должны быть уникальными, но поскольку словари не отсортированы, sorted может быть хорошей идеей?

4. @mikuszefski в Python 3, где dict_keys объект уже сопоставим с set теми же значениями, нет необходимости, но в Python 2 ключи представляют собой список, поэтому создание набора делает его независимым от порядка (и O(n) более эффективно, чем O(n log n) сортировка). Это не для того, чтобы сделать их уникальными (как вы говорите, они уже должны быть).

5. @jonrsharpe На самом деле фактические данные намного сложнее, чем те, которые я упомянул, данные представлены в строковом формате . Даже для преобразования в формат json и его синтаксического анализа требуется много регулярных выражений, чтобы преобразовать его в правильный формат. Таким образом, выбирая регулярное выражение, вы сначала удаляете соответствующую информацию.

Ответ №1:

Пробовал другое регулярное выражение, на данный момент это, похоже, работает нормально:

 r'({"A":[0-9]*.?[0-9]*,"B":[0-9]*.?[0-9]*,"C":[0-9]*.?[0-9]*})