生成尽可能最好的regexp匹配
给定一个regexp R,例如生成尽可能最好的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
^[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时,包括其中包含完整正则表达式的那些,这将是非常困难的(缺少暴力解决方案)。谢谢,这证实了我的想法。