2013-11-04 39 views
2

我在python中遇到了以下問題,我希望您能提供幫助。檢查正則表達式的邏輯連接

輸入是2個正則表達式,我必須檢查它們的連接是否可以有值。 例如,如果有人說長度大於10的字符串和另一個字符表示最多5個字符串,則不能通過這兩個表達式。

python中有沒有解決這個問題的東西?

謝謝, 最大。

+0

請參閱[檢查給定的正則表達式是否匹配任何內容](http://stackoverflow.com/q/17954519/222914) –

回答

1

python中是否有解決這個問題的東西?

Python中沒有任何東西可以直接解決這個問題。

也就是說,你可以通過使用lookahead斷言來模擬兩個正則表達式的邏輯和操作。有一個很好的例子解釋Regular Expressions: Is there an AND operator?

這將組合正則表達式,但不會直接顯示是否存在滿足組合正則表達式的字符串。

0

及彼此蠻力算法: Generating a list of values a regex COULD match in Python

def all_matching_strings(alphabet, max_length, regex1, regex2): 
"""Find the list of all strings over 'alphabet' of length up to 'max_length' that match 'regex'""" 

if max_length == 0: return 

L = len(alphabet) 
for N in range(1, max_length+1): 
    indices = [0]*N 
    for z in xrange(L**N): 
     r = ''.join(alphabet[i] for i in indices) 
     if regex1.match(r) and regex2.match(r):     
      yield(r) 

     i = 0 
     indices[i] += 1 
     while (i<N) and (indices[i]==L): 
      indices[i] = 0 
      i += 1 
      if i<N: indices[i] += 1 

return 

例如使用情況,您的具體情況(二正則表達式)......你需要的所有可能的符號/空格/等添加到該字母也...:

alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890' 
import re 
regex1 = re.compile(regex1_str) 
regex2 = re.compile(regex1_str) 
for r in all_matching_strings(alphabet, 5, regex1, regex2): 
    print r 

這就是說,在這個運行時是超級瘋狂,你會想要做任何你可以加快它。一個關於我刷過算法的答案的建議是過濾字母表,只有正則表達式「可能」的字符。所以,如果你掃描你的正則表達式,你只看到[1-3]和[a-eA-E],沒有「。」,「\ w」,「\ s」等,那麼你可以減小字母到13的長度。很多其他的小技巧你也可以實現。

+0

由於運行時指數的原因,這看起來似乎沒有用處。顯然,我不可能有一臺超級計算機運行這個每次我需要估計rejexes –

0

我非常懷疑像這樣的東西被實現,甚至有一種方法來有效地計算它。

現在我想起來的一種近似方式是檢測最明顯的衝突,那就是生成一個符合每個正則表達式的隨機字符串,然後檢查正則表達式的串聯是否匹配生成的字符串的串聯。

喜歡的東西:

import re, rstr 
s1 = rstr.xeger(r1) 
s2 = rstr.xeger(r2) 
print re.match(r1 + r2, s1 + s2) 

雖然我真的不能想到這個辦法失敗。在我看來,對於你的例子,其中r1匹配超過10個字符的字符串,r2匹配比5個字符短的字符串,那麼兩者的總和將產生字符串,第一部分長度大於10,尾部長度小於5。

+0

我似乎無法想到我的頭頂的例子,但這似乎不是一個好方法來證明有用的東西。在我的例子中,我需要的檢查應該是r1 + r2失敗,並且沒有字符串滿足它 –

+0

我懷疑正則表達式是否具有代表性的權力來創建可能會影響並置的斷言。 –