2016-01-31 4 views
0

Я пытаюсь создать регулярное выражение, чтобы соответствовать любому появлению двух или более повторяющихся буквенно-цифровых символов. Ниже регулярное выражение не удается:Почему это регулярное выражение для поиска повторяющихся символов терпит неудачу?

import re 
s = '__commit__' 
m = re.search(r'([a-zA-Z0-9])\1\1', s) 

Но когда я изменить его на это работает:

m = re.search(r'([a-zA-A0-9])\1+', s) 

Я очень озадачен, почему это так оно и есть. Может ли кто-нибудь дать представление?

+0

кажется, что вы пропустите a ')': 'm = re.search (r '([a-zA-A0-9]) \ 1+', s)' –

+4

'\ 1 \ 1' означало бы, что символ повторяется три раза (первая группа захвата плюс две обратные ссылки), которая не будет работать, поскольку в вашем примере есть только два последовательных повторяющихся символа. Второй работает, потому что '\ 1 +' означает «один или несколько», что означает, что можно сопоставить. –

+0

@AliNikneshan спасибо за головы, исправил его –

ответ

1

Посмотрите на эту линию.

m = re.search(r'([a-zA-Z0-9])\1\1', s) 

Вы используете шаблон и две обратные ссылки (ссылка уже сопоставленного шаблона). Таким образом, он будет соответствовать только при появлении минимум трех последовательных символов. Вы можете сделать:

m = re.search(r'([a-zA-Z0-9])\1', s) 

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

Однако следующее намного лучше.

m = re.search(r'([a-zA-A0-9])\1+', s) 

Это потому, что теперь вы пытаетесь соответствовать по крайней мере, один или несколько обратных ссылок \1+, то есть минимум два последовательных символа.

+1

Спасибо, все имеет смысл, кроме третьего примера, который вы дали. Если \ 1 относится к группе захвата, но группа захвата еще не определена (закрытая скобка не встречается), почему это работает? –

+0

О, извините. Обновлено. –

1

\1 является обратной ссылкой на любую из ранее сопоставленных групп. Таким образом, исходное регулярное выражение, которое не работает для вас, по существу означает:

Соответствует буквенно-цифровым строкам, содержащим 3 вхождения ранее сопоставленной группы. В этом случае ранее подобранная группа ([a-zA-Z0-9]) содержит один символ a-z или A-Z или 0-9. Затем у вас есть два '\1 в вашем регулярном выражении, в котором учитываются две обратные ссылки на ранее согласованный символ.

Во втором регулярное выражение с задней опорной \1 имеет перед ней + что означает матч по крайней мере один вхождение ранее захваченного характера - это означает, что строка в подтверждение этого шаблона должно быть зарегистрировано не менее 2 символов длина.

Надеюсь, это поможет.

Смежные вопросы