生成正则表达式在Python中可以匹配的值列表

生成正则表达式在Python中可以匹配的值列表,python,regex,Python,Regex,我尝试使用正则表达式作为输入,并从中生成正则表达式将匹配的所有可能值 因此,例如,如果正则表达式是“以a开头,以c结尾的三个字母单词”,那么代码将生成一个值为[aac、abc、acc、adc、a1c….]的列表 有没有一个简单的方法可以做到这一点?我正在使用python。您不想这样做。大多数结果集都是巨大的,有些结果集是无限的。相反,使用一系列测试向量,并依次对每个向量应用正则表达式: vectors = ( 'foo', 'bar', ... ) for result in (r

我尝试使用正则表达式作为输入,并从中生成正则表达式将匹配的所有可能值

因此,例如,如果正则表达式是“以a开头,以c结尾的三个字母单词”,那么代码将生成一个值为[aac、abc、acc、adc、a1c….]的列表


有没有一个简单的方法可以做到这一点?我正在使用python。

您不想这样做。大多数结果集都是巨大的,有些结果集是无限的。相反,使用一系列测试向量,并依次对每个向量应用正则表达式:

vectors = (
  'foo',
  'bar',
  ...
)

for result in (re.match(someregex, entry) for entry in vectors):
  ...

一些正则表达式匹配有限数量的输入字符串,但许多(大多数?)匹配无限数量的输入字符串。这有点像问‘给定python语言语法,生成所有可能的python程序’。如果您尝试的话,您可能会编写一个程序来按顺序列出它们(尽管运行起来会花费无限的时间),但是您确定要这样做吗?你为什么要这么做


我很确定标准库中的正则表达式引擎不会公开生成所需输出的方法。您必须获得对内部数据结构的较低级别访问,或者自己实现一些DFA引擎的东西。

这里有一个蛮力解决方案应该可以工作。它的运行时间为O(L^max_length)(其中L是字母表的大小),因此使用它的风险自负

def all_matching_strings(alphabet, max_length, regex):
"""Find the list of all strings over 'alphabet' of length up to 'max_length' that match 'regex'"""

if max_length == 0: return 

L = len(alphabet)
for N in range(1, max_length+1):
    indices = [0]*N
    for z in xrange(L**N):
        r = ''.join(alphabet[i] for i in indices)
        if regex.match(r):                
           yield(r)

        i = 0
        indices[i] += 1
        while (i<N) and (indices[i]==L):
            indices[i] = 0
            i += 1
            if i<N: indices[i] += 1

return
它将输出长度为5的所有字符串,从f序列开始,然后是1-3的非空序列,然后结束:

1
2
3
f1
11
21
31
f2
12
22
32
f3
13
23
33
ff1
[more output omitted...]

当且仅当regexp中存在量词(+或*)时,匹配字符串集是无限的。你的问题似乎不是针对那些模式。我相信来自
itertools
的函数在这里可能会有所帮助

例如,您可以引入一个表示任意字母的特殊字符(例如下划线),然后构建如下模式

patt = 'a_c'
def genInstances(patt):
    elems = [c if c != '_' else youralphabet for c in patt]
    return itertools.product(*elems)
定义你的字母表

youralphabet = 'abcde...'
定义一个函数,生成所有可能的实例

patt = 'a_c'
def genInstances(patt):
    elems = [c if c != '_' else youralphabet for c in patt]
    return itertools.product(*elems)

然后,您可以通过解析模式来扩展此方法以匹配真实的regexp,方法是将模式解析为
\d
[a-zA-Z]
或其他任何内容。

其中一些结果集将是巨大的。其中一些结果集将是无限的。是的,我计划让人们输入他们想要的任何regex,然后测试它的命中率。如果超过一个给定的数字,抛出一个错误。你可以通过从字母表字符串中过滤出任何在正则表达式中根本没有出现的字符来加速它,因为它们永远不会匹配。您还可以检查正则表达式是否必须匹配字母表中没有的字符,如果必须匹配,则返回一个空列表,因为它永远不会成功。这是比较复杂的,因为你必须只考虑必须总是匹配的字符,例如,如果你的例子中的正则表达式是x+[1-3] +$',但如果它是x*[1-3] +$',则不是这样。这看起来是一个合理的解决方案。我不想定义我的字母表,但我同意这似乎是必要的。