2016-04-04 37 views
0

你好我是python的新手,我希望你能幫助我。我有一個文本文件(稱爲data.txt)與基因編號和相應的rs號和一些距離測量數據。數據看起來像這樣:從python中的文本文件中提取一個字符串2.7.5

rs1982171  55349  40802 

    rs6088650  55902  38550 

    rs1655902  3105  12220 

    rs1013677  55902  0 

其中第一列是RS號,第二列是基因數,第三列是一些距離度量。數據要大得多,但希望上面的內容能讓您瞭解數據集。我想要做的是找到與某個基因相對應的所有rs數字。例如,對於上面的數據集,基因55902 = {rs6088650,rs1013677}。理想情況下,我想讓我的代碼找到與給定基因相對應的所有rs數字。因爲我不能現在做,我不是寫了一個短代碼,讓包含在data.txt文件字符串「55902」的臺詞:

import re 
    data=open("data.txt","r") 
    for line in data: 
     line=line.rstrip() 
     if re.search("55902",line): 
     print line 

這段代碼的問題是,輸出這樣的事情:

rs6088650 55902  38550 

    rs1655902 3105  12220 

    rs1013677 55902  0 

我想我的代碼忽略rs號中的字符串「55902」。換句話說,我不知道我的代碼輸出在上面的輸出的第二行,因爲基因數目不55902.我想我的輸出是:

 rs6088650  55902 38550 

     rs1013677  55902 0 

如何修改上面的代碼達到我想要的。任何幫助,將不勝感激。提前致謝。

+0

根據你想要多少個不同的基因,以收集RS號碼,你'將所有數據放入['pandas'](http://pandas.org)'DataFrame'並在那裏分析它可能會好得多。 – MattDMo

+0

感謝您的建議! –

回答

0

這裏沒有必要使用正則表達式,因爲您要查找的只是一個簡單的靜態序列。這條線:

if re.search("55902",line): 

可以表示爲:

if "55902" in line: 

如果你只想檢查第二列,分割行頭:

if '55902' in line.split()[1]: 

既然你現在已經檢查了正確的列,請檢查平等而不是成員資格:

if line.split()[1] == '55902': 
0

您可以使用word boundary (\b),以全字匹配搜索:

>>> import re 
>>> re.search(r"\b55902\b", "rs1655902  3105  12220") 
>>> re.search(r"\b55902\b", "rs6088650  55902  38550") 
<_sre.SRE_Match object at 0x7f82594566b0> 

if re.search(r"\b55902\b", line): 
    .... 
0

您可以用更強大的正則表達式很容易做到這一點。一個可能的快速解決方案是使用以下形式的正則表達式:

r'\b55902\b' 

\b字界限。

0

如果你想使用regex,那麼你可以使用Word邊界\b沿着matchsearch作爲

x = " rs1982171  55349  40802".strip() 

if (re.match(r"\b55349\b", x.split()[1])): 
    print x 

IDEONE DEMO