Совпадение строк с чередующимися символами - PullRequest
3 голосов
/ 28 июня 2019

Я хочу сопоставить строки, в которых каждый второй символ одинаков. например 'abababababab'

Я пробовал это: '' '(([a-z]) [^ / 2]) *' ''

Выходные данные должны возвращать полную строку, так как она похожа на 'abababababab'

Ответы [ 4 ]

1 голос
/ 28 июня 2019

Вы можете сопоставить первое [a-z] с последующим захватом ([a-z]) в группе.Затем повторите 0+ раз, снова сопоставляя az и обратную ссылку на группу 1, чтобы сохранить каждый второй символ одинаковым.

^[a-z]([a-z])(?:[a-z]\1)*$

Пояснение

  • ^Начало строки
  • [a-z]([a-z]) Совпадение az и захват в группе 1, совпадающей с az
  • )(?:[a-z]\1)* Повторить 0+ раз, сопоставляя az с последующей обратной ссылкой на группу 1
  • $ Конец строки

Regex demo

1 голос
/ 28 июня 2019

Это на самом деле невозможно сделать в реальном регулярном выражении с количеством состояний, полиномиальных по размеру алфавита, потому что это выражение не является грамматикой уровня Хомского 0.


Однако регулярные выражения Pythonна самом деле не являются регулярными выражениями, и могут обрабатывать гораздо более сложные грамматики, чем это.В частности, вы можете поместить свою грамматику следующим образом:

(..)\1*

(..) - это последовательность из 2 символов.\1* соответствует точной паре символов произвольное (возможно, нулевое) количество раз.


Я интерпретировал ваш вопрос как желание, чтобы все остальные символы были равны (ababab работает, но abcbdb не удается).Если вам нужно, чтобы только 2-й, 4-й, ... символы были равны, вы можете использовать похожий.

.(.)(.\1)*
0 голосов
/ 28 июня 2019

Это немного сложное выражение, может быть, мы начнем с:

^(?=^[a-z]([a-z]))([a-z]\1)+$

если я правильно понял проблему.

Демо

0 голосов
/ 28 июня 2019

Хотя это не регулярное выражение, вы можете сделать что-то вроде этого:

def all_same(string):
    return all(c == string[1] for c in string[1::2])

string = 'abababababab'
print('All the same {}'.format(all_same(string)))

string = 'ababacababab'
print('All the same {}'.format(all_same(string)))

string[1::2] говорит, что начинается со 2-го символа (1), а затем вытаскивает каждый второй символ (часть 2).

Возвращает:

All the same True
All the same False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...