2016-04-04 26 views
0

こんにちは私はPythonには初めてです。私があなたを助けてくれることを願っています。私は、対応するrs番号といくつかの距離の測定値を持つ遺伝子番号のデータを持つテキストファイル(data.txtと呼ぶ)を持っています。Pythonでテキストファイルから文字列を抽出する2.7.5

最初の列は、RSの数である
rs1982171  55349  40802 

    rs6088650  55902  38550 

    rs1655902  3105  12220 

    rs1013677  55902  0 

、2番目の列は遺伝子の数であり、3番目の列は、いくつかの距離の尺度である:データは次のように見えます。データははるかに大きいですが、上記のデータセットのアイデアを得ることができれば幸いです。私がしたいのは、特定の遺伝子に対応するすべてのrs番号を見つけることです。例えば、上記のデータセットの場合、遺伝子55902 = {rs6088650、rs1013677}。理想的には、自分のコードが与えられた遺伝子に対応するすべてのrs番号を見つけるようにしたい。

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

このコードの問題が出力されていることである:私は私が代わりにdata.txtをファイルに文字列「55902」を含む行を与える短いコードを書いた今、それを行うことができませんので、

rs6088650 55902  38550 

    rs1655902 3105  12220 

    rs1013677 55902  0 

rs番号の文字列 "55902"を無視するようにします。私は上記のコードを変更するにはどうすればよい

 rs6088650  55902 38550 

     rs1013677  55902 0 

:遺伝子数は55902.私は私の出力がなりたいではないので、他の言葉では、私は出力しないように上記の出力の2行目を私のコードを実行します私が望むものを達成する。どんな助けもありがとう。前もって感謝します。

+0

としてワード境界\bとともにmatchまたはsearchを使用することができますおそらくあなたのすべてのデータを['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を使用する場合は、あなたは、あなたのためのRS番号を収集したいどのように多くの異なる遺伝子によって

x = " rs1982171  55349  40802".strip() 

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

IDEONE DEMO

関連する問題