2015-08-13 4 views
2

У меня есть s = 'QMMQSM'. Я хочу вернуться ['QMM']. Число совпадений совпадений. Почему это не работает?Backreference внутри группы внутри lookahead

re.findall('(?=(\w(\w)\2))',s)

Если у меня есть два символов X и Y, мне нужно, чтобы соответствовать XYY как MOO или BOO. Бонус: Как заставить X не равняться Y?

ответ

3
print re.findall(r'(?=(\w(\w)\2))',s) 

       ^^ 

Вы должны использовать r .Its сырец method.That удалит escaping issues`.

или

print re.findall('(?=(\w(\w)\\2))',s) 

          ^^ 

Это позволит регулярное выражение для доступа \2, который будет обрабатывать питона.

re.findall(r"(?=((\w)(?!\2)(\w)\3))",s) 

Вы можете использовать это, чтобы обеспечить соблюдение X not equal to Y .Увидь демо.

https://regex101.com/r/uF4oY4/11

+0

Мне нужно совместить перекрывающиеся строки, поэтому мне нужен lookahead –

+0

@ RenéG check edit.You нужно использовать 'r' – vks

0

Использование findall возвращает текст, что ваши регулярные выражения матчи. Поскольку lookaheads ничего не потребляют, ваш текст соответствует, но совпадение не содержит текста. Он просто смотрит вперед, видит нужный материал и сопоставляет пустую строку перед (\w(\w)\2).

Вы можете получить группу, если вы используете search вместо findall, так что вы получите объект матч назад:

>>> re.search(r'(?=(\w(\w)\2))',s).group(1) 
'QMM' 

(Вы также можете использовать finditer, который дает вам итератор над объектами матча, а не совпадающий текст сам.)

+0

Будет ли это совпадение совпадений совпадением? –

+0

@ RenéG: Да, если вы используете 'finditer' для получения всех совпадений. – BrenBarn

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