РЕДАКТИРОВАТЬ: на основе обмена комментариями - если вас просто интересует четность подсчета букв, то вам не нужно регулярное выражение , и вместо этого вам нужен подход, подобный рекомендации @ jon.(Если вам не важен порядок, тогда более производительный подход с очень длинными строками может использовать что-то вроде collections.Counter
.)
Мой лучший выбор относительно того, что вы пытаетесь сопоставитьis: «один или несколько символов - вызовите этот подшаблон A - за которым следует другой набор из одного или нескольких символов - вызовите этот подшаблон B - с последующим повторением подшаблона A».
Вы можете использовать +
какярлык «один или несколько» (вместо того, чтобы указывать его один раз, а затем использовать *
для остальных совпадений), но в любом случае вам нужно получить правильные подшаблоны.Давайте попробуем:
>>> import re
>>> pattern = re.compile(r'(.+?)(.+?)\1')
>>> pattern.sub('\g<2>', 'abbcabbabca')
'bbcbaca'
Хмм.Это не сработало.Зачем?Поскольку первый шаблон не является жадным, наш «подшаблон A» может просто соответствовать первому a
в строке - в конце концов, действительно появляется позже.Поэтому, если мы используем жадное совпадение, Python будет возвращаться назад, пока не найдет такой длинный шаблон для подшаблона A, который по-прежнему допускает появление шаблона ABA:
>>> pattern = re.compile(r'(.+)(.+?)\1')
>>> pattern.sub('\g<2>', 'abbcabbabca')
'cbc'
Выглядит хорошо для меня.