2017-10-15 59 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 ''