我特別關注R,Perl和shell。但任何其他編程語言也可以。根據返回的結果和以前的正則表達式的規則創建一個新的正則表達式|索引正則表達式並查看正則表達式如何匹配子字符串
問題
有沒有一種方法,以在視覺上或程序檢查和指數基於正則表達式匹配的字符串?這是爲了引用第一個正則表達式及其第二個正則表達式的結果,以便能夠修改匹配字符串的一部分併爲該特定部分編寫新規則。
https://regex101.com確實可視化某個字符串如何匹配正則表達式。但它遠非完美,對於我的龐大數據集效率不高。
問題
我有我的第一個正則表達式各地12000所匹配的字符串(DNA序列),我想處理這些字符串和基於一些嚴格的規則找到一個文件裏其他一些字符串順利以及那些基於嚴格規則的12000場比賽。
簡單的例子
這是我第一次正則表達式(簡化,較短的版本我原來的正則表達式)通過我第一個文本文件運行。
[ACGT]{1,12000}(AAC)[AG]{2,5}[ACGT]{2,5}(CTGTGTA)
讓我們假設它發現在我的大文本文件中的以下三個子字符串:
1. AAACCCGTGTAATAACAGACGTACTGTGTA
2. TTTTTTTGCGACCGAGAAACGGTTCTGTGTA
3. TAACAAGGACCCTGTGTA
現在我有一個第二個文件其中包括一個非常大的字符串。從這第二個文件中,我只對提取匹配新的(第二個)正則表達式的那些子字符串感興趣,該新的正則表達式本身依賴於我的第一個正則表達式在幾個部分中。 因此,這第二個正則表達式必須考慮第一個文件中匹配的子字符串,並查看它們與第一個正則表達式匹配的方式!
請允許我,爲了簡單起見,指數我的第一個正則表達式的緣故以這種方式更好地說明:
first.regex.p1 = [ACGT]{1,12000}
first.regex.p2 = (AAC)
first.regex.p3 = [AG]{2,5}
first.regex.p4 = [ACGT]{2,5}
first.regex.p5 = (CTGTGTA)
現在我第二(新)的正則表達式將搜索第二個文本文件並將取決於第一個正則表達式的結果(以及第一個文件返回的子串如何與第一個正則表達式匹配)將按以下方式定義:
second.regex = (CTAAA)[AC]{5,100}(TTTGGG){**rule1**} (CTT)[AG]{10,5000}{**rule2**}
在這裏規則1和規則2依賴於從第一個文件的第一個正則表達式來匹配。因此,
rule1 = look at the matched strings from file1 and complement the pattern of first.regex.p3 that is found in the matched substring from file1 (the complement should of course have the same length)
rule2 = look at the matched strings from file1 and complement the pattern of first.regex.p4 that is found in the matched substring from file1 (the complement should of course have the same length)
你可以看到,第二個正則表達式有一個屬於自己的部分(即它們是獨立於任何其他的文件/正則表達式),但它也有依賴於第一個文件的結果和規則部分的第一個正則表達式以及第一個文件中的每個子字符串如何匹配第一個正則表達式!
現在再次爲了簡單起見,我使用file1中第三個匹配的子字符串(因爲它比其他兩個短),以向您展示第二個文件的可能匹配以及它如何滿足第二個正則表達式:
這是我們從我們的第一個正則表達式的實驗,獲得通過的第一個文件:
3. TAACAAGGACCCTGTGTA
所以在這場比賽中,我們看到:
T has matched first.regex.p1
AAC has matched first.regex.p2
AAGGA has matched first.regex.p3
CC first.regex.p4
CTGTGTA has matched first.regex.p5
現在在第二個文件的第二個正則表達式中,我們看到當查找與第二個正則表達式匹配的子字符串時,我們依賴於來自第一個文件(與第一個正則表達式匹配)的結果。特別是我們需要查看匹配的子串並補充匹配first.regex.p3和first.regex.p4(rule1和rule2 from second.regex)的部分。
complement means:
A will be substituted by T
T -> A
G -> C
C -> G
所以,如果你有TAAA,補充將是ATTT。
因此,回到這個例子:
- TAACAAGGACCCTGTGTA
我們需要補充以下以滿足第二正則表達式的要求:
AAGGA has matched first.regex.p3
CC first.regex.p4
並補充如下:
TTCCT (based on rule1)
GG (based on rule2)
所以匹配second.regex子串的例子是這樣的:
CTAAAACACCTTTGGG TTCCT CTTAAAAAAAAAGGGGGAGAGAGAAGAAAAAAAGAGAG GG
這只是一個例子!但在我的情況下,我有12000匹配的子字符串!我無法弄清如何解決這個問題。我試圖寫純正則表達式,但我完全沒有實現任何正確遵循這個邏輯的東西..也許我不應該使用正則表達式?
是否有可能完全使用正則表達式完成此操作?或者我應該看看另一種方法?是否有可能索引一個正則表達式,並在第二個正則表達式引用回到第一個正則表達式,並強制正則表達式考慮第一個正則表達式返回的匹配子串?
問題中有一點不清楚。假設你將在first.regex.p3中匹配'AAGGA',那麼第二個文件中的相應匹配應該是什麼:完全是'TTCCT'還是[CT] {2,5}?甚至是[CT] {5}? –
@MarcLambrichs我真的很抱歉,我的文本是複雜和混亂。我在嘗試簡化原始正則表達式和結果時也迷失在自己的文本中。回答你的問題:是的!它應該完全是'TTCCT',因爲第二個文件中該正則表達式特定相關部分的匹配長度應該與第一個文件中找到的匹配長度完全相同。另一個例子:如果'first.regex.p4'匹配某個子字符串的第一個文件中的'GGGG',那麼第二個文件(第二個正則表達式)中的相應匹配肯定應該是'CCCC'。 –
這是因爲這些基本上是兩條DNA鏈,並且在某些時候它們部分形成了一個鹼基對(它們聚集在一起並相互粘在一起)。所以第二個文件中的TTCCT從第一個文件中粘貼到AAGGA。 http://www.michaelwosnick.com/CancerResearch/wp-content/uploads/DNA-replication-from-visionlearning.jpg –