Регулярное выражение для проверки каждой подстроки
У меня был этот вопрос на экзамене в конце семестра, к сожалению, я не мог решить его и пробовал несколько дней, но не повезло.
Условие - для каждой подстроки длины 4 в строке длины n напишите RE, чтобы форсировать правило - должно быть ровно три единицы.
Мое решение вроде как (1+11+111+€)(0111)*(0+€).
Но это, очевидно, неправильно, строка 11011 также является допустимым решением.
Обновление - мое новое решение (1+11+111+€)(0111)*(0+01+011+€).
Обновление - оператор плюс на самом деле 'ИЛИ'
Обновление - € пустая строка
Обновление - длина строки не имеет требований. Строка длиной 5 будет иметь 2 подстроки длиной 4, первые 4 символа и последние 4 символа
3 ответа
Python 2
import re
# regular expression
# '^' in the start of the expression means from the very start of the string
# "[^1.]*" means match any character unless it is '1'
# '$' in the end of the expression means till the very end of the string
# Summary:
# from the start of the string till the end of it check if we have
# '1' exactly 3 times,
# and before or after them you might find any type of characters
# and these characters must not be equal '1' ...
expression = '^[^1.]*1[^1.]*1[^1.]*1[^1.]*$'
# testing strings
tests = ["01110", "11100", "00111", "010101", "00100100111", "00100"]
prog = re.compile(expression)
for test in tests:
print 'matched' if prog.match(test) else 'not matched'
Изменить: Рассмотрим следующее регулярное выражение, где € относится к пустой строке и предполагая, что алфавит состоит только из {0,1, €}:
€ + (0111) * + (1110) * + (1101) * + (1011) *
Я думаю, что профессор ищет осознание того, что для выполнения условия 1 никогда не может заключаться в скобки с нулями с обеих сторон.
(0?11)*
Чтобы завершить картину, мы также должны включить случай для n= 1, где допускается либо 0, либо 1 (я полагаю).
^[01]$|(0?11)*
Я использую традиционное регулярное выражение здесь, где [...]
обозначает класс персонажа, |
"или", скобки делают группировку, и *
указывает ноль или более повторений (звезда Клини).