2012-04-25 109 views
0

我有我的函數給定輸入文件的規則列表。如果它們中的任何一個在給定的文件中被違反,我希望我的程序返回錯誤消息並退出。匹配每行的元素

  • 文件中的每一基因應該是相同的染色體

因此,對於線路如:

NM_001003443 CHR11 + 5997152 5927598 5921052 5926098 1 5928752,5925972,5927204,5396098, NM_001003444 CHR11 + 5925152 5926098 5925152 5926098 2 5925152,5925652,5925404,5926098, NM_001003489 CHR11 + 5925145 5926093 5925115 5926045 4 5925151,5925762,5987404,5908098, 等

文件中的每一行都將是此行的變化

因此,我希望確保該文件中的每一行是CHR11

然而,我可以得到一個文件與CHR的不同列表(和任何數量的數字)。因此,我想編寫一個函數,以確保在每行的chr中找到的數字是相同的。

我應該使用正則表達式嗎?或者我該怎麼做?順便說一句,這是python。

如:chr \ d +? 我不確定如何確保,無論是匹配的是在每行,雖然同...

我目前有:

from re import * 
for line in file: 
    r = 'chr\d+' 
    i = search(r, line) 
    if i in line: 

,但我不知道如何確保它是同樣在每行...

在參考sajattack的回答

fp = open(infile, 'r') 
for line in fp: 
     filestring = '' 
     filestring +=line 
     chrlist = search('chr\d+', filestring) 
     chrlist = chrlist.group() 
     for chr in chrlist: 
      if chr != chrlist[0]: 
       print('Every gene in file not on same chromosome') 
+1

你能給一個輸入文本(多行)和什麼被認爲是「有效」的例子嗎?如果該行有'chr11',那麼文件中的其他每行都應該在字符串中包含'chr11'? – Jack 2012-04-25 02:00:57

+1

這聽起來像是Python的[string functions](http://docs.python.org/tutorial/introduction.html#strings)和[regex library]的一個_very_ straighforward應用程序(http://docs.python.org/library /re.html)。也許有點過於直接,值得在SO上發佈一個問題... – jogojapan 2012-04-25 02:01:30

+0

對,它非常簡單。我只是不斷遇到錯誤,我是編程新手,需要一些幫助。 – 2012-04-25 02:21:38

回答

3

只需讀取該文件,並有一個while循環檢查每一行以確保它包含chr11。有字符串函數來搜索字符串中的子字符串。只要您找到返回false的行(不包含chr11),就跳出循環並設置標記valid = false

import re 

fp = open(infile, 'r') 
fp.readline() 
tar = re.findall(r'chr\d+', fp.readline())[0] 
for line in fp: 
    if (line.find(tar) == -1): 
     print("Not valid") 
     break 

這應該搜索行中的數字並檢查有效性。

+0

對,但我需要讓數字變量,以防它不是我正在尋找的chr11,而是另一個chr。他們都需要是相同的字符串(然後數字) – 2012-04-25 02:20:53

+0

我看到,有效性函數應該工作。 – Jack 2012-04-25 02:47:14

+0

這是事情。用我給的文件。我不想輸入數字來查看染色體是否在那裏。我只是想確保不管一行中的字符數是多少,它在文件中的每一行都是一樣的。但是我不能在函數中輸入一個數字...... – 2012-04-25 02:51:49

1

可以肯定的是,第一個字母是正確的嗎?如果是,請使用:

import re 
chrlist = re.findall("chr[0-9]+", open('file').read()) 
#^this is a list with all chr(whatever numbers) 
for chr in chrlist: 
    if chr != chrlist[0] 
     print("Chr does not match") 
     break 
+0

好吧,這可能會起作用,因爲不管第一個還是第22個都是正確的,只要所有其他人都等於那個,那應該沒問題吧? – 2012-04-25 02:39:52

+0

這實際上可能不起作用,因爲這是對列表中的每個元素(任何可能的數字,這是一個硬名單),如果該元素不等於它不匹配的列表,是正確的? – 2012-04-25 02:46:56

+0

它正在製作我們正在檢查的字符串中的所有字符串(無論數字)的列表。假設我們正在檢查「NM_001003443 chr11 + 5997152 5927598 5921052 5926098 1 5928752,5925972,5927204,5396098 NM_001003444 chr11 + 5925152 5926098 5925152 5926098 2 5925152,5925652 5925404,5926098 NM_001003489 chr10 + 5925146 5926095 5925152 5926045 4 5925151, 5925762,5987404,5908098,chr11 + 5925145 5926093 5925115 5926045 4 5925151,5925762,5987404,5908098,該列表將是['chr11','chr11','chr10','chr11'] – sajattack 2012-04-25 02:49:42

0

我的解決方案使用「匹配組」從「chr」字符串中收集匹配的數字。

import re 

pat = re.compile(r'\schr(\d+)\s') 

def chr_val(line): 
    m = re.search(pat, line) 
    if m is not None: 
     return m.group(1) 
    else: 
     return '' 

def is_valid(f): 
    line = f.readline() 
    v = chr_val(line) 
    if not v: 
     return False 

    return all(chr_val(line) == v for line in f) 

with open("test.txt", "r") as f: 
    print("The file is {0}".format("valid" if is_valid(f) else "NOT valid")) 

注:

  • 預編譯的正則表達式的速度。

  • 使用原始字符串(r'')指定正則表達式。

  • 該模式在chr字符串的任一側需要空格(\s)。

  • is_valid()返回False如果第一行沒有好的chr值。然後它返回一個布爾值,如果以下所有行匹配第一行的chr值,則該值爲true。

  • 您的示例代碼只是打印一些像The file is True,所以我使它更友好一點。

+0

這看起來工作從看它。然而,因爲我只是試圖將它作爲一個更大功能的一小部分,所以我並沒有試圖做出多種功能。我不確定如何在不調用其他函數的情況下將其納入函數,但對於我所尋找的內容而言,這可能有點複雜,儘管我確信它的工作原理。它可能不適用於其他功能。 – 2012-04-25 03:32:56

+0

我真的不確定你在這裏問我什麼。爲什麼這個代碼很難從另一個函數調用? – steveha 2012-04-25 03:37:45

+0

那麼,你不能在一個函數中定義一個函數,對吧?我知道你可以調用一個函數,但是我不知道該輸入到基函數中調用的那些函數中 – 2012-04-25 03:39:17