天天看點

python子字元串出現的位置_在負位置提前搜尋在特定位置出現子字元串的字元串...

我隻是在嘗試建立一個正規表達式時遇到一個探查,它應該有助于查找包括子字元串的特定組合的字元串。

例如我正在搜尋子字元串組合:

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