#python #regex
#python #регулярное выражение
Вопрос:
У меня есть два словаря: A, B
Ключи представляют собой прогрессивные числа от 0 до 1000.
Значение может быть none (пустым) или некоторой цифрой (максимум 8 цифр)
ПРИМЕР.
A = {"0":"100","1":"32","2":"89827","3":"12345", "4":"12345"}
B = {"0":"", "1":"3", "2":"8827", "3":"12385", "4":"1535"}
Я хочу выяснить, есть ли различия в значениях «B» относительно «A», поэтому в моем примере:
B[1] respect A[1] = missing one digit (2)
B[2] respect A[2] = missing one digit (9)
B[3] respect A[3] = one digit is different (8)
B[4] respect A[4] = one digit is different (5) and missing one digit (3)
Я пытаюсь использовать подстановочный знак, но он не найден для отсутствующих значений.
Есть предложения?
Комментарии:
1. Покажите нам, что вы конкретно пробовали, пожалуйста.
2. нужно ли регулярное выражение?
3. Как насчет
A.values() == B.values()
?4. Для этого требуется больше логики, чем для одного регулярного выражения … вы ищете difftool
5. Я бы тоже не стал этого делать с регулярным выражением..
Ответ №1:
Этот скрипт будет делать то, что вы просите:
import difflib
diff = {}
for k, a_value in A.items():
b_value = B[k]
matcher = difflib.SequenceMatcher(a=b_value, b=a_value)
diff[k] = []
for opcode, b_start, b_end, a_start, a_end in matcher.get_opcodes():
a_range = a_value[a_start:a_end]
b_range = b_value[b_start:b_end]
if opcode == 'replace':
diff[k].append("%s digit(s) are different (%s)" % (len(b_range), b_range))
elif opcode == 'delete':
diff[k].append("has an extra %s digit(s) (%s)" % (len(b_range), b_range))
elif opcode == 'insert':
diff[k].append("missing %s digit(s) (%s)" % (len(a_range), a_range))
for k in sorted(diff.keys()):
print "B[%s] respect A[%s] = %s" % (k, k, diff[k] and " and ".join(diff[k]) or "no differences")
Вывод:
B[0] respect A[0] = missing 3 digit(s) (100)
B[1] respect A[1] = missing 1 digit(s) (2)
B[2] respect A[2] = missing 1 digit(s) (9)
B[3] respect A[3] = 1 digit(s) are different (8)
B[4] respect A[4] = missing 3 digit(s) (234) and has an extra 2 digit(s) (35)
Это не дает точного результата, который вы просили, потому что алгоритм, лежащий в difflib.SequenceMatcher
основе, не пытается найти минимальные последовательности редактирования, но, надеюсь, это сработает.
Это можно увидеть в результате для A[4]
vs B[4]
.
Если вы хотите получить точный результат, который вы просили, вам нужно будет запустить свой собственный алгоритм.