首页 > 解决方案 > 为正则表达式查找长度为 0 - 4 的所有单词(方法?)

问题描述

我有一个由 0 和 1 组成的字母表和一个正则表达式,例如:1*(011+)*1*. 现在我将找到该语言中所有长度为 0 - 4 且符合正则表达式的单词。所以输出将是: , 1, 11, 011, 111... 等。

我不应该将单词或数字列表作为参数,但该方法应该自己生成所有这些单词。模块中是否有一个函数或方法re.可以做到这一点?

标签: pythonregexwordgenerate

解决方案


标准库中没有函数可以生成长度为 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)

推荐阅读