2017-10-15 64 views
1

我正在寫函數,試圖從Resume中提取用戶名。在嵌套循環中檢查字符串存在

大部分時間第一行包含用戶名,但有時候我的學生還會在第一行寫上簡歷,簡歷標題。所以我想忽略這條線並檢查下一行。

如果在沒有前四線的簡歷中跳過的話行中出現,再考慮它作爲一個人的名字

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並逐行觀看執行。

  • 您的代碼沒有使用(也不需要)面向對象的方法。當函數defclass中定義的方法時,將使用self參數。事實上,從不在函數定義中使用self這一事實表明,您可以在類定義之外編寫一個常規函數定義。刪除self參數。

  • 你沒有比較小寫字母和小寫字母。您的代碼將硬編碼列表的項目轉換爲小寫,但文本參數保持原樣。在你的skip_words常數中使用小寫字母,並在傳遞給函數的文本上調用lower,而不是在常量上調用lower

  • 如果您遍歷列表元素本身,Python代碼通常更具可讀性。使用變量來表示每個元素,而不是訪問列表元素的計數器。這也可以避免使用if語句來檢查前四行的存在。

  • 在函數中通常最好只使用一個return語句。

  • break將退出for循環,我想你打算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 ''