2017-06-20 26 views
0

我試圖在python中編寫代碼,這將幫助我查找兩個特定字符串之間的字符串。當我用一個字符串實現代碼時,我會得到所需的輸出。但是,我需要在一系列序列中匹配模式。它一直拋出我一個錯誤。在python中查找兩個字符串之間的特定模式 - fastq文件 - 測序讀取

定義一個函數來尋找兩個用戶指定的序列之間的模式:

import re 
def find_between(prefix, suffix, text): 
pattern = r"{}\s*(.*)\s*{}".format(re.escape(prefix), re.escape(suffix)) 
result = re.search(pattern, text, re.DOTALL) 
if result: 
    return result.group(1) 
else: 
    return None 

當我嘗試一個字符串,它的工作原理:

text = "AGGTCCTGTAAACCT" 
prefix = "TCCT" 
suffix = "ACCT" 
find_between(prefix, suffix, text) 

輸出: 'GTAA'

但是,當我嘗試讀取fastq文件並執行搜索時,它不會:

seqs = readFastq('FN1.fastq') 

text = seqs 
prefix = "TCCT" 
suffix = "ACCT" 
find_between(prefix, suffix, text) 

它拋出我這個錯誤

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-26-9c35672e7561> in <module>() 
    2 prefix = "TCCT" 
    3 suffix = "ACCT" 
----> 4 find_between(prefix, suffix, text) 

<ipython-input-19-5f42599c717f> in find_between(prefix, suffix, text) 
    3 def find_between(prefix, suffix, text): 
    4  pattern = r"{}\s*(.*)\s*{}".format(re.escape(prefix),  re.escape(suffix)) 
----> 5  result = re.search(pattern, text, re.DOTALL) 
    6  if result: 
    7   return result.group(1) 

/Users/shravantikrishna/anaconda/lib/python3.6/re.py in search(pattern, string, flags) 
180  """Scan through string looking for a match to the pattern, returning 
181  a match object, or None if no match was found.""" 
--> 182  return _compile(pattern, flags).search(string) 
183 
184 def sub(pattern, repl, string, count=0, flags=0): 

TypeError: expected string or bytes-like object 
+0

文本變量可能不是字符串或字節。如果你打印出類型(文本),你會得到什麼?在調用find_between之前,您可以將「文本」轉換爲實際的字符串或字節對象... –

+0

它仍然不起作用。另外,你知道我如何允許在前綴和後綴中最多有兩個字母不匹配嗎?在真實情況下,後綴和前綴將是相同的字符串。 – user8033590

回答

0

我不會用正則表達式在這看似簡單的情況下匹配。如果您有興趣在前綴和後綴之間找到文本,則可以使用: result = text.lstrip(前綴[:2]).rstrip(後綴[:2]) 但是您沒有說出哪兩個字符你不需要在前綴和後綴中匹配。

下面是一些示例代碼和數據...

text = 'XXsome data that needs to be parsedXX' 
prefix = 'XXYY' 
suffix = 'XXYY' 
result = text.lstrip(prefix[:2]).rstrip(suffix[:2]) 
print(result) 

some data that needs to be parsed 
+0

謝謝!清楚的是,我有一個序列 - 說ATGC,在兩個序列AGGCCCCC和AGGCCCCC之間。即使任何兩個字母在AGGCCCCC中不匹配,我也想提取出ATGC。上面的代碼將不起作用,因爲它沒有考慮任何位置的不匹配。 – user8033590

+0

我會收回我所說的不需要正則表達式,因爲它聽起來像是在文本和前綴/後綴中面臨着更大的數據可變性。所以這會讓你回頭看看什麼類型的對象readFastq(' FN1.fastq')返回,看看爲什麼正則表達式拋出一個異常。它似乎在抱怨文本也是seqs。 –

+0

是的,我認爲這可能是問題。因爲當我使用一個字符串,它的工作原理,即使有兩個字符串,它會拋出我的錯誤。是否有一種方法可以讓它讀取一串字符串並將結果作爲列表返回? – user8033590

相關問題