В стандартной библиотеке нет функции для генерации всех строк длиной 0-4, состоящих только из символов 0 и 1, но их нетрудно построить.
Особый случайдвоичных чисел
Обратите внимание, что все строки, которые вы хотите проверить, являются двоичными представлениями ниже 16 (= 10000 в двоичном виде).
import re
def binary_numbers_below(n):
return [bin(k)[2:] for k in range(n)]
for word in binary_numbers_below(2**4):
if re.fullmatch('1*(011+)*1*'):
print(word) # word is part of your language
Необходимо обрезать первуюдва символа bin(k)
, потому что bin(k)
выводит числа в виде 0b1000
и нам не нужен префикс 0b
.
Общий случай
Если вы хотите сгенерировать все слова определенной длины для любого данного алфавита, вам нужно проделать дополнительную работу:
import re
from itertools import product
def words_of_alphabet(alphabet, min_length, max_length):
return [''.join(characters)
for length in range(min_length, max_length+1)
for characters in product(alphabet, repeat=length)]
for word in words_of_alphabet(['0', '1'], 0, 4):
if re.fullmatch('1*(011+)*1*'):
print(word) # word is part of your language
words_of_alphabet(['0', '1'], 0, 4)
также будет включать пустое слово, тогда как первый метод - нет.
Используя генераторы , вы можете более элегантно кодировать обе функции
def binary_numbers_below(n):
for k in range(n):
yield bin(k)[2:]
def words_of_alphabet(alphabet, min_length, max_length):
for length in range(min_length, max_length+1):
for characters in product(alphabet, repeat=length):
yield ''.join(characters)