2017-10-15 12 views
1

Resumeからユーザー名を抽出しようとしている関数に書いています。ネストされたループ内の文字列の有無をチェック

ほとんどの場合、最初の行にユーザー名が含まれていますが、時には私の生徒も履歴書、CVタイトルを1行目に書きます。だから私はそのような行を無視して次の行をチェックしたい。

ラインIF履歴書の最初の4行が発生内のスキップ言葉なしで、その後、人物名

ここ
def name_extractor(self, text): 
    skip_words = ['CURRICULUM', 'VITAE', 'resume'] 
    text_lines = text.split('\n') 
    name = '' 
    # pdb.set_trace()   
    for i in range(0,4): 
     if text_lines[i]: 
      for word in skip_words: 
       if word.lower() in text_lines[i]: 
        break 
       else: 
        name = text.split('\n')[i] 
        # print name 
        return name   
    return name 

としてそれを考える私はロジックを作成しようとしたが、それは正常に動作していません。レジュームとして最初の行がある場合でも、レジュームとして名前が付けられます。

skip_listから任意の単語を持つ行をスキップして、正しい名前を印刷するにはどうすればよいですか。

私はこれに関する助けに感謝します。

+0

あなたの質問はありますか? –

+0

@CarlosMonroyNieblas:申し訳ありませんが、質問が更新されました。まだ明確でない場合はお知らせください – honeyboney

+0

名前を検索しているファイルの例は、より良いコードを作成するのに役立ちます! –

答えて

0

あなたのコードが期待どおりに機能しない主な理由は、skip_wordsのいずれかがテキストの行にないとすぐに関数が返ることです。

この質問に対する回答以外にも、基本に関するヘルプが必要です。 pythontutor.comにコードを貼り付けて、行ごとに実行を見てみてください。

  • あなたのコードは、オブジェクト指向のアプローチを使用していません(また必要としません)。 selfパラメータは、defファンクションがclass内で定義されたメソッドである場合に使用されます。あなたの関数定義にselfを絶対に使用しないという事実は、クラス定義の外で正規の関数定義を書くだけでいいというサインです。 selfパラメータを削除します。

  • 大文字と小文字を比較していません。あなたのコードは、ハードコードされたリストの項目を小文字に変換しますが、テキストパラメータは大文字と小文字のままです。 skip_words定数に小文字を使用し、定数にlowerを呼び出すのではなく、関数に渡されるテキストに対してlowerを呼び出します。

  • リスト要素自体を繰り返し処理すると、一般にPythonコードが読みやすくなります。変数を使用して、リスト要素にアクセスするカウンタではなく、各要素を表現します。これにより、最初の4行の存在を確認するために使用する文が不要になります。

  • 通常は、関数内に1つのreturn文を使用することが最善です。

  • breakforループを終了します、と私はあなたが次の反復へのループや事前のための残りの部分をスキップしますcontinueをつもりだと思います。

    def name_extractor(text): 
        skip_words = ['curriculum', 'vitae', 'resume'] 
        text_lines = text.split('\n') 
        for line in text_lines[:4]: 
         line_words = set(line.lower().split(' ')) 
         if not line_words.intersection(skip_words): 
          return line 
        return '' 
    
関連する問題