2013-12-12 73 views
2

給定正則表達式R,例如^[a-z]+$和與其不匹配的字符串,例如, [email protected],我怎樣才能生成匹配的S的最長子集(在這種情況下,abcde)?生成儘可能好的正則表達式匹配

我對一般解決方案感興趣,例如對於R=/^[0-9]+(?=[a-z])/S=x123a算法應該返回123a

換句話說,問題是:應該從非匹配字符串中刪除哪些內容以便匹配。

+0

你不應該那麼就使用'[AZ] + '然後內爆的結果?另外,你使用什麼語言? – HamZa

+1

你的問題是相當開放的。如果你只是想消除與特定字符集不匹配的所有內容,請嘗試使用/ [^ az] + // g' –

+1

@squeamishossifrage:更新問題 – georg

回答

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("[email protected]", re.compile(r"^[a-z]+$"))) 
print(find_longest("x123a", re.compile(r"^[0-9]+(?=[a-z])"))) 

輸出:

abcde 
123a 
+0

謝謝,這證實了我的想法。 – georg