生成最佳的正则表达式匹配

时间:2013-12-12 11:13:30

标签: regex algorithm language-agnostic

给定正则表达式R,例如^[a-z]+$和不匹配它的字符串,例如abc-d@e,如何生成匹配的S的最长子集(在本例中为abcde)?

我对一般解决方案感兴趣,例如R=/^[0-9]+(?=[a-z])/S=x123a算法应返回123a

换句话说,问题是:应该从不匹配的字符串中删除哪些内容以使其匹配。

1 个答案:

答案 0 :(得分:2)

我认为蛮力是唯一的(可行的,没有编写自己的正则表达式引擎)解决方案:

import itertools
import re

def all_substrings(s):
    for i in reversed(range(len(s))):
         for sequence in itertools.combinations(range(len(s)), i+1):
             yield "".join(s[n] for n in sequence)

def find_longest(s, regex):
    for substring in all_substrings(s):
        if regex.search(substring):
            return substring

print(find_longest("abc-d@e", re.compile(r"^[a-z]+$")))
print(find_longest("x123a", re.compile(r"^[0-9]+(?=[a-z])")))

输出:

abcde
123a