2017-02-07 5 views
0

У меня был этот вопрос на экзамене в конце семестра, к сожалению, я не мог его решить и пробовал в течение нескольких дней и не повезло.Регулярное выражение для проверки каждой подстроки

Условие. Для каждой подстроки длины 4 в строке длины n напишите RE, чтобы заставить правило - должно быть ровно три 1.

Мое решение вроде бы (1 + 11 + 111 + €) (0111) * (0 + €).

Но это, очевидно, неверно, строка 11011 также является допустимым решением.

Обновление - мое новое решение (1 + 11 + 111 + €) (0111) * (0 + 01 + 011 + €).

Обновление- оператора плюс на самом деле 'OR'

Обновление- € пустая строка

Update - длина строки не имеет каких-либо требований. Строка длины 5 будет иметь 2 подстроки длины 4, первые 4 символа и последние 4 символа

+0

Что произойдет, если строка имеет 10 символов? Как мы обрабатываем последние два символа? –

+0

Мы можем обрабатывать только 4 последовательных символа за раз, последняя подстрока будет последними 4 символами –

+0

Итак, мы можем предположить, что строка кратна 4 длинам тогда? –

ответ

0

Я думаю, что профессор ищет осознание того, что для того, чтобы условие удерживалось, 1 никогда не может быть заключено в квадратные скобки по нулям с обеих сторон.

(0?11)* 

Для полноты картины мы также должны включать в себя случай для п = 1, где либо 0 или 1 разрешено (я полагаю).

^[01]$|(0?11)* 

Я использую традиционные регулярные выражения здесь, где [...] обозначает класс символов, | есть «или» круглые скобки сделать группировку, и * указывает ноль или более повторений (Клини звезды).

+0

Не будет 011011 на вашем языке RE? Но рассмотрим первую подстроку длиной 4, 0110 - она ​​имеет два 1, но нам нужно ровно три 1. –

+0

Извините, я пропустил «точно» и предположил «по крайней мере». Вы хотите, чтобы я удалил этот ответ, или я должен оставить его в качестве подсказки для кого-то еще, чтобы, возможно, разработать рабочий ответ? – tripleee

+0

Все в порядке, вы можете оставить его здесь. Если вы получите ответ, отправьте его здесь! –

0

Edit: Рассмотрим следующее регулярное выражение, где ссылается на пустую строку и предполагая, что алфавит состоит только {0,1, €}:

€ + (0111) * + (1110) * + (1101) * + (1011) *

+0

01110 не находится в вашем RE, но 01110 является допустимой строкой –

0

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

Не могли бы вы объяснить, как вы пришли к этому? –

+0

Я обновил свой ответ, добавив больше объяснений о том, как работает регулярное выражение, это ссылка, которая может помочь вам разобраться, как работают регулярные выражения http://www.rexegg.com/regex-quickstart.html –