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

mo49yndu  于 2023-06-25  发布在  Python
关注(0)|答案(5)|浏览(75)

我尝试使用正则表达式作为输入,并从那里生成正则表达式匹配的所有可能值。
因此,例如,如果正则表达式是“以a开头,以c结尾的三个字母的单词”,那么代码将生成一个值为[aac,abc,acc,adc,a1c....]的列表。
有什么简单的方法吗?我用的是python。

w51jfk4q

w51jfk4q1#

这里有一个蛮力解决方案,应该工作。它的运行时间为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

示例用法:

alphabet = 'abcdef1234567890'
import re
regex = re.compile('f*[1-3]+$')
for r in all_matching_strings(alphabet, 5, regex): 
    print r

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

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

voase2hg2#

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

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

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

v2g6jxz63#

匹配字符串的集合是无限的,当且仅当您的regexp中有一个量词(+或 *)。你的问题似乎不是针对这些模式。我宁愿相信itertools的产品功能可能会在这里有所帮助。
例如,您可以引入一个特殊字符来表示任意字母(例如一个下划线),然后构建一个像这样的模式

patt = 'a_c'

定义你的字母表

youralphabet = 'abcde...'

并定义一个函数,生成所有可能的示例,如下所示

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

然后,您可以通过解析\d[a-zA-Z]等模式来扩展这种方法,以匹配真实的regexp。

yvgpqqbh

yvgpqqbh4#

一些正则表达式匹配有限数量的输入字符串,但是很多(大多数?)匹配无限数量的输入字符串。这有点像问“给定Python语言语法,生成所有可能的Python程序”。如果你尝试的话,你也许可以写一个程序来按顺序列出它们(尽管这将花费无限的时间来运行),但是你确定你想这样做吗?你为什么要这么做?
我很确定标准库中的正则表达式引擎没有公开生成您想要的输出的方法。您必须获得对内部数据结构的较低级别访问,或者自己实现一些DFA引擎。

vxbzzdmp

vxbzzdmp5#

rstr-library中的xeger-function执行此操作:https://pypi.org/project/rstr/

对于简单的正则表达式(即大多数正则表达式),可以生成与给定正则表达式匹配的字符串。如果实现使用正则表达式编译到的状态机,那么这可以比接受答案的指数时间蛮力方法更有效地完成。
效率将是一个执行质量问题。许多语言都有这个功能的库,所以如果速度很关键的话,可以看看其他的实现,比如Javas Xeger或Javascript randexp.js。

相关问题