Понимание Python re matching engine [duplicate]

Давайте перепишем ваш код следующим образом:

x = 1
y = [x]
z = y * 4

myList = [z] * 3

После этого запустите следующий код, чтобы сделать все более понятным. Что делает код, в основном печатает id s полученных объектов, которые

Вернуть «идентификатор» объекта

и поможет нам идентифицировать их и проанализировать, что происходит:

print("myList:")
for i, subList in enumerate(myList):
    print("\t[{}]: {}".format(i, id(subList)))
    for j, elem in enumerate(subList):
        print("\t\t[{}]: {}".format(j, id(elem)))

И вы получите следующий результат:

x: 1
y: [1]
z: [1, 1, 1, 1]
myList:
    [0]: 4300763792
        [0]: 4298171528
        [1]: 4298171528
        [2]: 4298171528
        [3]: 4298171528
    [1]: 4300763792
        [0]: 4298171528
        [1]: 4298171528
        [2]: 4298171528
        [3]: 4298171528
    [2]: 4300763792
        [0]: 4298171528
        [1]: 4298171528
        [2]: 4298171528
        [3]: 4298171528

Итак, теперь давайте шаг за шагом. У вас есть x, который является 1, и единственным списком элементов y, содержащим x. Ваш первый шаг - y * 4, который даст вам новый список z, который в основном [x, x, x, x], т. Е. Создает новый список, который будет содержать 4 элемента, которые являются ссылками на исходный объект x. Чистый шаг очень похож. В основном вы делаете z * 3, который является [[x, x, x, x]] * 3 и возвращает [[x, x, x, x], [x, x, x, x], [x, x, x, x]] по той же причине, что и для первого шага.

2
задан zx81 21 July 2014 в 04:08
поделиться

1 ответ

Группа повторных захватов: номер группы остается тем же

Группа, определенная (..), является группой 1. Конец квантора + повторяет его. Каждый раз, когда движок может повторять группу (совпадающие с двумя символами), группа 1 перезаписывается.

  • Когда двигатель начинает совпадать, он захватывает aa в группу 1
  • Затем он фиксирует bb до группы 1
  • . Затем захватывает cc в группу 1.

Когда вы проверяете группу 1, двигатель возвращает cc. Все остальные записи потеряны.

(Исключением является механизм .NET, который также возвращает cc, а также позволяет проверять промежуточные захваты благодаря объекту CaptureCollection. Он будет содержать aa, bb и cc .)

С помощью (..)+(...), почему группа 1 содержит aa? Откат!

Чтобы понять это, нам снова нужно следовать по пути движка регулярного выражения.

  • Еще раз, когда двигатель начинает совпадать, он захватывает aa в группу 1
  • Опять же, он повторяет группу (..) и фиксирует bb в группе 1
  • . Опять же, он повторяет группу (..) и захватывает cc в группу 1
  • Теперь двигатель пытается сопоставить (...). Он терпит неудачу: нет никаких символов, оставшихся для потребления.
  • Двигатель отступает как в строке, так и в шаблоне регулярных выражений. + означает один или несколько раз, и мы сопоставили .. три раза, поэтому мы можем дать один или даже два. На этом этапе двигатель отказывается от последнего совпадения количественной группы (..)+, которая является cc. Мы вернулись, когда группа 1 была bb.
  • Двигатель снова пытается сопоставить (...). Осталось всего два символа: cc, поэтому он снова не работает.
  • Двигатель отступает, отказываясь от последнего совпадения количественной группы (..)+, которая является bb. На этом этапе группа 1 снова aa.
  • Двигатель снова пытается сопоставить (...). Успешно: группа 2 - bbc, а группа 1 - aa

Ссылка

4
ответ дан zx81 18 August 2018 в 11:34
поделиться
  • 1
    FYI Я добавил подробное объяснение внутренности двигателя для случая (..)+(...). Также настоятельно рекомендуем прочитать «Сведения о горах». статья связана. :) – zx81 21 July 2014 в 03:52
  • 2
    Решил удалить мою, не хотелось писать историю. – hwnd 21 July 2014 в 03:56
  • 3
    @hwnd Да, довольно интересно понять, как это работает, но, как вы говорите, вам нужно написать весь рассказ о двигателе. :) – zx81 21 July 2014 в 04:04
  • 4
    Эй Deqing, я добавил много деталей, поэтому, пожалуйста, дайте мне знать, если что-то неясно. :) – zx81 21 July 2014 в 04:22
  • 5
    Очень подробно, спасибо zx81 – Deqing 21 July 2014 в 06:49
Другие вопросы по тегам:

Похожие вопросы: