Регулярное выражение Python

#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] .

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