我隻是在嘗試建立一個正規表達式時遇到一個探查,它應該有助于查找包括子字元串的特定組合的字元串。
例如我正在搜尋子字元串組合:
ab-ab-cd
1)“ xxxabxxxxxxabxxxxcdxxx”->應該比對
2)“ xxxabxxxxabxxxxabxxxxcdxxxx->沒有比對項
3)“ xxxabxxxxxxxxxxcdxxxx->不比對
使它更加複雜:
4)“ xxxabxxxxxabxxxxcdxxxabxxx->也應比對
我的子字元串組合也可能是這樣的:
A B C D
要麼
Ab-ab-ab-cd
要麼
ab-cd-ab-cd
對于所有這些(以及更多)示例,我正在尋找一種系統的方式以系統的方式建構相應的正規表達式,以便僅找到比對的字元串,其中子字元串以正确的順序和正确的頻率出現。
對于“ ab-ab-cd”子字元串搜尋,我得到了類似的内容,但是在示例4)的情況下卻失敗了。
p = re.compile("(?:(?!ab).)*ab.*?ab(?!.*ab).*cd",re.IGNORECASE)
在類似4)的情況下,此方法适用于,但也可以比對類似2)的字元串:
p = re.compile("(?:(?!ab).)*ab(?:(?!ab).)*ab((?!ab|cd)*).*cd", re.IGNORECASE)
您能指出我的錯誤嗎?
非常感謝!
編輯:
對不起,我的問題還不夠清楚。我試圖将我的問題分解為一個更簡單的案例,這可能不是一個好主意。這裡是問題的詳細說明:
我列出了(蛋白質)序列,并根據序列模式為每個序列指定了特定的類型。
是以,我建立了一個字典,将類型名稱作為鍵,并将特征模闆(按特定順序列出序列特征)作為值,例如:
type_a-> [A,A,B,C]
type_b-> [A,B,C]
type_c-> [A,B,A,B]
在其他字典中,我對每個功能都有(簡單的)正規表達式模式,例如:
A-> [PHT] AG [QP] LI
B-> RS [TP] EV
C-> ...
D-> ...
現在,每個模闆(type_a,type_b,...)我現在都要系統地建構級聯的正規表達式模式(即,對于type_a,建構正規表達式以搜尋A,A,B,C)。然後,這将導緻另一個字典,類型為鍵,而完整的正規表達式為值。
現在,我想周遊序列清單中的每個序列,并針對每個序列映射所有完整的正規表達式模闆。在最佳情況下,隻有一個完整的正規表達式(類型)應與序列比對。
從上面的示例開始,具有以下正規表達式模闆:
CD光牒
A B C D
ab-ab-cd
Ab-ab-ab-cd
ab-cd-ab-cd
ab-ab-cd-ab
“ xxxabxxxxxxabxxxxcdxxx”
->此序列應與模闆“ ab-ab-cd”的正規表達式比對,而不與其他任何比對
使用以下正規表達式,我可以完美地找到ab-ab-cd。
p = re.compile("(?:(?!ab).)*ab.*?ab(?!.*ab).*cd",re.IGNORECASE)
如果我的測試是正确的,它将僅比對上面的序列1),而不比對2)或3)。
但是,如果我要搜尋ab-ab-cd-ab,則負向查找将不允許找到最後一個ab。我發現類似以下代碼的内容可以打破第二個“ ab”部分之後的負面預測。以我的了解,否定的超前應該以“ cd”停止,以便最後的“ ab”可以再次比對。
p = re.compile("(?:(?!ab).)*ab(?:(?!ab).)*ab((?!ab|cd)*).*cd", re.IGNORECASE)
它解決了ab-ab-cd-ab中最後一個“ ab”的問題。但是現在,它不但與“ cd”之前的2倍“ ab”比對(序列1)-ab-ab-cd),而且還與“ cd”之前的3倍(ab)比對(序列) 2,ab-ab-ab-cd),應該不要。
我希望我的問題更加清楚。非常感謝您提供所有答案,明天我将在工作時嘗試使用該代碼。任何進一步的答案都将受到高度贊賞,對正規表達式代碼的解釋(對正規表達式來說我還很陌生)以及使用re.functions(match,final ...)的建議。
謝謝
解決方案
為什麼您需要負面的展望?為什麼不使用那麼簡單的東西:
*ab.*ab.*cd
或者,如果您需要它從行的開頭查找比對項,則可以使用:
^.*ab.*ab.*cd
編輯:在您發表評論後,我了解了您的需求。試試這個:
^(?:(?!ab).)*ab(?:(?!ab).)*ab(?:(?!ab).)*cd