2016-04-15 2 views
1

私はPythonプログラムにいくつかの助けが必要です。私は何時間も努力しましたが、うまくいきません。正規表現パターンに基づいてテキストファイルからデータを抽出する方法

私を助けることができる人は誰ですか?

これは私が必要なものである:

  • 私はこのファイルを持っている:http://www.filedropper.comタンパク質に関する情報が含まれています。
  • 私は、一致するタンパク質のみをフィルタリングしたいです。これらのタンパク質から
  • は、私は..私はしたい[])
  • の間、唯一>sp|後6つのトークンの...(テキスト、および種(第2ラインを必要とし..in。 。、そして最終的には、テーブル内

.... 

Human       AAA111 
Mouse       BBB222 
Fruit fly      CCC333 

私は今のところあります。

import re 

def main(): 
    ReadFile() 
    file = open ("file.txt", "r") 
    FilterOnRegEx(file) 

def ReadFile(): 
    try: 
     file = open ("file.txt", "r") 
    except IOError: 
     print ("File not found!") 
    except: 
     print ("Something went wrong.") 

def FilterOnRegEx(file): 
    f = ("[AG].{4}GK[ST]") 
    for line in file: 
     if f in line: 
      print (line) 


main() 

あなたが私を助けてくれたらあなたは英雄です!

+5

あなたのためのいくつかのコード。多くのユーザーは、苦労しているコーダーのコードを作成したいと考えていますが、通常、ポスターが既に問題を解決しようとしているときにのみ役立ちます。この努力を実証する良い方法は、これまでに書いたコード、サンプル入力(もしあれば)、予想される出力、実際に得られる出力(コンソール出力、トレースバックなど)を含めることです。あなたが提供する詳細があれば、受け取る可能性のある回答が増えます。 [FAQ]と[ask]を確認してください。 –

+1

こんにちは、ようこそ。 http://stackoverflow.com/help/how-to-ask :)を読んでください。人々は時々あまり歓迎されないので、あなたはたぶん下降してしまいますが、あまり心配しないでください。あなたの質問を更新するか、新しいものを作成してください。これまでに試したことの中で一番いいことと、あなたが遭遇した問題があります。私はあなたが助けを受けるだろうと確信しています。 –

+0

編集されました。しかし、私は正規表現関数に詰まっているので、コードはあまりありません。そして、私は何も試していません、私は何時間も何時間も試してみましたが、うまくいきません。しかし、それは編集されました! –

答えて

3

私の最初の勧告は、ファイルを開くときwithステートメントを使用することです:

with open("ploop.fa", "r") as file: 
    FilterOnRegEx(file) 

あなたFilterOnRegEx方法に問題がある:if ploop in line。文字列引数を持つin演算子は、文字列lineを検索して、正確なテキストをploopにします。

代わりに、あなたは試合のためにsearch、その後、再オブジェクトにテキスト形式をcompileする必要があります。

def FilterOnRegEx(file): 
    ploop = ("[AG].{4}GK[ST]") 
    pattern = re.compile(ploop) 
    for line in file: 
     match = pattern.search(line) 
     if match is not None: 
      print (line) 

これはあなたが前方に移動するのに役立ちます。

次のステップとして、generatorsについて学習することをお勧めします。一致する行を印刷することは素晴らしいですが、それでそれらの行をさらに操作するのには役立ちません。 printyieldに変更して、必要な部分を抽出して出力用に再フォーマットするなどのデータ処理をさらに進めることができます。簡単なデモとして

def FilterOnRegEx(file): 
    ploop = ("[AG].{4}GK[ST]") 
    pattern = re.compile(ploop) 
    for line in file: 
     match = pattern.search(line) 
     if match is not None: 
      yield line 

with open("ploop.fa", "r") as file: 
    for line in FilterOnRegEx(file): 
     print(line) 


補遺:私は、私はあなたがポストされたデータのサンプルを使用して、上記の、投稿のコードを実行し、それが成功したいくつかの行を印刷し他にはありません。言い換えれば、正規表現は一部の行と一致し、他の行と一致しませんでした。ここまでは順調ですね。 しかし、の場合、必要なデータがすべて1行に入力されているわけではありません。つまり、パターン上の個々の線のフィルタリングが不十分です。(もちろん、質問に正しい行区切りが表示されない限り)レコードがいつ始まるかを知るために、より堅牢なパーサを実装するために必要な質問にデータがある方法、レコード何らかの行がレコードの途中にあるかどうかを調べます。

+0

良い説明をありがとう!確かに、これは動作します。学校で収量について何も学んだことはありませんでしたが、実際には有用です。正規表現が動作することを知っておくとよいでしょう。しかし、スクリプトはすべての行をREと一致する行に属するものとして出力する必要があります。 (タンパク質配列に一致するものがあれば、これらのタンパク質に関するファイルからすべての情報を出力しなければならない)。その後、私はアクセッションコード(第1タンパク質のQ6GZX2)と種(第1タンパク質のFrogウイルス3(分離Goorha)(FV-3))を取る必要があります。 1/2 –

+0

リストでリストを作成することをお勧めします(2つの改行で区切られたタンパク質のリスト、アクセッションコードや種を含む情報のリストを含む)、またはそこにはもっといい方法? –

+0

個人的には、1つのレコードのデータ構造を作成してから、そのファイルのパーサを作成します。リストのリストと、各レベルでの各インデックスの意味を把握するのではなく、データのクラスを作成するときにコードを管理する方が簡単です。 – dsh

0

これはサンプルテキストで動作するようです。あなたがファイルごとに複数の抽出を持つことができるかどうかは分かりませんが、私はここに時間がないので、必要ならばそれを拡張する必要があります:

#!python3 
import re 

Extract = {} 

def match_notes(line): 
    global _State 
    pattern = r"^\s+(.*)$" 
    m = re.match(pattern, line.rstrip()) 
    if m: 
     if 'notes' not in Extract: 
      Extract['notes'] = [] 

     Extract['notes'].append(m.group(1)) 
     return True 
    else: 
     _State = match_sp 
     return False 

def match_pattern(line): 
    global _State 
    pattern = r"^\s+Pattern: (.*)$" 
    m = re.match(pattern, line.rstrip()) 
    if m: 
     Extract['pattern'] = m.group(1) 
     _State = match_notes 
     return True 
    return False 

def match_sp(line): 
    global _State 
    pattern = r">sp\|([^|]+)\|(.*)$" 
    m = re.match(pattern, line.rstrip()) 
    if m: 
     if 'sp' not in Extract: 
      Extract['sp'] = [] 
     spinfo = { 
      'accession code': m.group(1), 
      'other code': m.group(2), 
     } 
     Extract['sp'].append(spinfo) 
     _State = match_sp_note 
     return True 
    return False 

def match_sp_note(line): 
    """Second line of >sp paragraph""" 
    global _State 
    pattern = r"^([^[]*)\[([^]]+)\)" 
    m = re.match(pattern, line.rstrip()) 
    if m: 
     spinfo = Extract['sp'][-1] 
     spinfo['note'] = m.group(1).strip() 
     spinfo['species'] = m.group(2).strip() 
     spinfo['sequence'] = '' 
     _State = match_sp_sequence 
     return True 
    return False 

def match_sp_range(line): 
    """Last line of >sp paragraph""" 
    global _State 
    pattern = r"^\s+(\d+) - (\d+):\s+(.*)" 
    m = re.match(pattern, line.rstrip()) 
    if m: 
     spinfo = Extract['sp'][-1] 
     spinfo['range'] = (m.group(1), m.group(2)) 
     spinfo['flags'] = m.group(3) 
     _State = match_sp 
     return True 
    return False 

def match_sp_sequence(line): 
    """Middle block of >sp paragraph""" 
    global _State 

    spinfo = Extract['sp'][-1] 

    if re.match("^\s", line): 
     # End of sequence. Check for pattern, reset state for sp 
     if re.match(r"[AG].{4}GK[ST]", spinfo['sequence']): 
      spinfo['ag_4gkst'] = True 
     else: 
      spinfo['ag_4gkst'] = False 

     _State = match_sp_range 
     return False 

    spinfo['sequence'] += line.rstrip() 
    return True 

def match_start(line): 
    """Start of outer item""" 
    global _State 
    pattern = r"^Hits for ([A-Z]+\d+)|([^:]+) : (?:\[occurs (\w+)\])?" 
    m = re.match(pattern, line.rstrip()) 
    if m: 
     Extract['pattern_id'] = m.group(1) 
     Extract['title'] = m.group(2) 
     Extract['occurrence'] = m.group(3) 
     _State = match_pattern 
     return True 
    return False 

_State = match_start 

def process_line(line): 
    while True: 
     state = _State 
     if state(line): 
      return True 

     if _State is not state: 
      continue 

     if len(line) == 0: 
      return False 

     print("Unexpected line:", line) 
     print("State was:", _State) 
     return False 

def process_file(filename): 
    with open(filename, "r") as infile: 
     for line in infile: 
      process_line(line.rstrip()) 

process_file("ploop.fa") 
import pprint 
pprint.pprint(Extract) 
+0

コードをありがとう!私はそれを試しました、それは私が必要なテーブルではありませんが、私は最終的なコードのためにこれを使用することができると思います!最初に私はエラー(http://i63.tinypic.com/2621kpw.png)でいくつかの行を取得し、その後私は彼らの他のデータ(http://i63.tinypic.com/312ehrp.png)でタンパク質を取得します。しかし、データ(アクセッションコードなど)が別の行にあり、名前が付いていることを確認するとよいでしょう!ありがとう –

関連する問題