2013-10-03 2 views
4

Я хочу утверждать, что строка содержит две идентичные подстроки.Как определить циклы в шаблоне регулярных выражений?

Я попытался это регулярное выражение: [A-ZA-Z]{2}

То, что я хочу, чтобы обнаружить:

AZAZ 
CUCU 
PIPI 

Но это регулярное выражение просто проверяет, есть ли 4 в верхнем регистре букв в строке, так

ABCD --> it's good and it shouldn't be 

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

+5

Ну какой язык/аромат вы используете? В основном вам нужно использовать обратную ссылку, которая не поддерживается во всех вариантах. В PCRE/PHP вы должны использовать '([A-Z] {2}) \ 1'. [См. Работу] (http://regex101.com/r/xR2iD0) – HamZa

+0

@HamZa Я не видел никакого аромата, который не поддерживает обратную связь. Вы знаете что-нибудь? Было бы странно, если бы не было возможности использовать backreference в regex. –

+0

@RohitJain Я не могу придумать один момент, но, проведя так много времени на SO, я столкнулся с проблемами, когда OP использует определенную систему/программу, где функции «обычного» регулярного выражения не поддерживаются. Если моя память не обманывает меня, то был случай, когда backreference (в матче) не поддерживался на определенном языке, но я не могу вспомнить, какой из них ... – HamZa

ответ

2

С Python вы можете сделать следующее:

p="((?P<two_chars>[A-Z]{2})(?P=two_chars))" 
s="AZAZABCDCUCUPIPI" 
re.findall(p, s) 
[('AZAZ', 'AZ'), ('CUCU', 'CU'), ('PIPI', 'PI')] 

, а затем извлечь из списка элементы, которые вы хотите. Или вы можете быть быстрее и делать:

[k for k,v in re.findall(p,s)] 
['AZAZ', 'CUCU', 'PIPI'] 

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

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