生成尽可能最好的regexp匹配

生成尽可能最好的regexp匹配,regex,algorithm,language-agnostic,Regex,Algorithm,Language Agnostic,给定一个regexp R,例如^[a-z]+$和一个与之不匹配的字符串,例如abc-d@e,如何生成匹配的S的最长子集(在本例中,abcde) 我对一个通用的解决方案感兴趣,例如R=/^[0-9]+(?=[a-z])/和S=x123a算法应该返回123a 换句话说,问题是:应该从不匹配的字符串中删除什么以便匹配。我认为暴力是唯一(可行的,不需要编写自己的正则表达式引擎)的解决方案: import itertools import re def all_substrings(s): fo

给定一个regexp R,例如
^[a-z]+$
和一个与之不匹配的字符串,例如
abc-d@e
,如何生成匹配的S的最长子集(在本例中,
abcde

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


换句话说,问题是:应该从不匹配的字符串中删除什么以便匹配。

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

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

难道你不应该只使用
[a-z]+
然后对结果进行内爆吗?还有,你用的是什么语言?你的问题相当开放。如果您只是想消除与特定字符集不匹配的所有内容,那么请尝试
s/[^a-z]+//g
@squemishossifrage:updated the questions internative question,但对于一个真正的通用解决方案,尤其是当允许使用lookaround时,包括其中包含完整正则表达式的那些,这将是非常困难的(缺少暴力解决方案)。谢谢,这证实了我的想法。