我正在尝试从Resume中提取用户名的函数。
大多数时候第一行包含用户名,但有时我的学生也会在第一行写下Resume,CV标题。所以我想忽略这一行并检查下一行。
如果在恢复的前四行内没有跳过单词的IF行,则将其视为人名
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)
您的代码没有按预期方式工作的主要原因是,只要任何一个skip_words不在一行文本中,函数就会返回。
你需要基本原则的帮助而不是这个问题的答案。尝试将代码粘贴到pythontutor.com并逐行观察执行。
您的代码没有使用(也不需要)面向对象的方法。当函数self
是def
中定义的方法时,将使用class
参数。事实上,你从不在函数定义中使用self
,这表明你可以在类定义之外编写常规函数定义。删除self
参数。
您不是将小写与小写进行比较。您的代码将硬编码列表的项目转换为小写,但文本参数保持原样。在skip_words
常量中使用小写,并在传递给函数的文本上调用lower
,而不是在常量上调用lower
。
如果您遍历列表元素本身,Python代码通常更具可读性。使用变量表示每个元素而不是计数器来访问列表元素。这也可以消除用于检查前四行是否存在的if
语句的需要。
通常最好只在函数中使用一个return
语句。
break
将退出for
循环,我认为您打算continue
将跳过for循环的其余部分并前进到下一次迭代。
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 ''