Поиск всех слов длиной 0 - 4 для регулярного выражения (метод?) - PullRequest
0 голосов
/ 09 октября 2019

У меня есть алфавит, состоящий из 0 и 1, и регулярное выражение, например: 1*(011+)*1*. Теперь я найду все слова языка, которые имеют длину 0 - 4 и соответствуют регулярному выражению. Таким образом, вывод будет: , 1, 11, 011, 111 ... и т. Д.

Я не должен давать список слов или чисел в качестве параметра,но метод должен генерировать все эти слова сам по себе. Есть ли в модуле re. функция или метод, который делает именно это?

1 Ответ

0 голосов
/ 10 октября 2019

В стандартной библиотеке нет функции для генерации всех строк длиной 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)
...