#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]*})