Недавно я играл с выражениями регулярных выражений в Python и столкнулся с проблемой с r"(\w{3})+"
и с ее не-жадным эквивалентом r"(\w{3})+?"
. Пожалуйста, давайте рассмотрим следующий пример:Захват групп и жадность в Python
S = "abcdefghi" # string used for all the cases below
1. Жадный поиск
m = re.search(r"(\w{3})+", S)
print m.group() # abcdefghi
print m.groups() # ('ghi',)
m.group
точно так, как я ожидал - только весь матч.
Относительно m.groups
пожалуйста, проверьте: ghi
печатается, так как он перезаписывается предыдущие захвачена группы def
и abc
, я прав? Если да, то могу ли я захватить все перезаписанные группы? Конечно, для этой конкретной строки я мог бы просто написать m = re.search(r"(\w{3})(\w{3})(\w{3})", S)
, но я ищу более общий способ захвата групп, не зная, сколько из них я могу ожидать, таким образом, metacharacter +
.
2. Non-жадный поиск
m = re.search(r"(\w{3})+?", S)
print m.group() # abc
print m.groups() # ('abc',)
Теперь мы не жадные так был найден только abc
- точно так, как я ожидал.
Относительно m.groups()
двигатель остановился, когда он нашел abc
, поэтому я понимаю, что это единственная найденная группа здесь.
3. Жадный FindAll
print re.findall(r"(\w{3})+", S) # ['ghi']
Теперь я действительно озадачен, я всегда считал, что функция re.findall
находит все подстроки, где RE спичек и возвращает их в виде списка. Здесь у нас есть только одно совпадение abcdefghi
(в соответствии с здравым смыслом и пулей), поэтому я ожидал наличия списка, содержащего этот элемент. Почему только ghi
был возвращен?
4. Non-жадный FindAll
print re.findall(r"(\w{3})+?", S) # ['abc', 'def', 'ghi']
Здесь, в свою очередь, я ожидал иметь abc
только, но, возможно, имея пулю объяснена поможет мне понять это, как хорошо. Может быть, это даже ответ на мой вопрос от bullet (о захвате перезаписанных групп), но я бы очень хотел понять, что здесь происходит.
Если что-то неясно, вы можете оставить комментарий здесь, и я буду обновлять ответ с соответствующими сведениями. –
Этот вопрос по-прежнему актуальный, и, конечно же, я теперь отдает должное тем людям, которые бескорыстно помогают другим. Моя задержка возникает из-за того, что я пытаюсь выяснить, насколько могу, самостоятельно и не беспокоить, чтобы помогать людям с множеством вопросов - эти два ответа были изначально непонятными и для моих вчерашних знаний требовалось много исследований , Во всяком случае, кажется, что мои намерения истолковываются негативно. Я начинаю знакомство с этим сайтом и не знаю его обычаев - если не будет неприятно задавать вопросы сразу, это здорово. – Drizzt
Это сайт вопросов и ответов. Вопросы должны быть о программировании: у вас есть задача, вы работаете над ней, застреваете с какой-то частью кода, вы просите о помощи, так как вы пробовали то или это, и это не работает. Подробнее в [Как спросить] (http://stackoverflow.com/help/how-to-ask). Этот ваш вопрос - это вопрос, который время от времени случается, но у вас действительно есть проблемы с пониманием основных вещей. Вы можете многому научиться на [regular-expressions.info] (http://regular-expressions.info). –