Я столкнулся с этой проблемой, когда работал над Python Challenge. Номер 10, если быть точным. Я решил попытаться решить эту проблему с помощью регулярных выражений — вытащить повторяющиеся последовательности, подсчитать их длину и построить следующий элемент последовательности на основе этого.
Итак, регулярное выражение, которое я разработал, было: '(\d)\1*'
Он хорошо работал в онлайновом тестере регулярных выражений, но при использовании его в моем скрипте он не работал так же:
regex = re.compile('(\d)\1*')
text = '111122223333'
re.findall(regex, text)
> ['1', '1', '1', '1', '2', '2', '2',...]
И так далее. Итак, я узнаю о необработанном типе в модуле re для Python. Каков мой первый вопрос: может кто-нибудь объяснить, что именно это делает? В документе это описано как уменьшение необходимости избегать обратной косой черты, но не похоже, что это требуется для более простых регулярных выражений, таких как \d+
, и я не понимаю, почему.
Поэтому я меняю свое регулярное выражение на r'(\d)\1*'
и теперь пытаюсь использовать findall()
, чтобы составить список последовательностей. И я получаю
> ['1', '2', '3']
Опять очень запутался. Я до сих пор этого не понимаю. Помоги пожалуйста?
Я решил сделать это, чтобы обойти это:
[m.group() for m in regex.finditer(text)]
> ['1111', '2222', '3333']
И получить то, что я искал. Затем, основываясь на этом потоке, я пытаюсь findall()
добавить группу в все регулярное выражение -> r'((\d)\2*)'
. В итоге я получаю:
> [('1111', '1'), ('2222', '2'), ('3333', '3')]
В этот момент я вся в замешательстве. Я знаю, что этот результат как-то связан с несколькими группами, но я просто не уверен.
Кроме того, это моя первая публикация, поэтому я извиняюсь, если мой этикет неверен. Пожалуйста, не стесняйтесь поправить меня и в этом. Спасибо!
re
.. - person Martijn Pieters   schedule 23.07.2012