给定正则表达式R,例如^[a-z]+$
和不匹配它的字符串,例如abc-d@e
,如何生成匹配的S的最长子集(在本例中为abcde
)?
我对一般解决方案感兴趣,例如R=/^[0-9]+(?=[a-z])/
和S=x123a
算法应返回123a
。
换句话说,问题是:应该从不匹配的字符串中删除哪些内容以使其匹配。
答案 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