Python 检查嵌套循环中是否存在字符串

Python 检查嵌套循环中是否存在字符串,python,loops,break,Python,Loops,Break,我正在写一个函数,试图从简历中提取用户名 大多数情况下,第一行包含用户名,但有时我的学生也会在第一行写简历、简历标题。所以我想忽略这一行,检查下一行 如果在简历的前四行中没有跳过单词的行,则将其视为人名 def name_extractor(self, text): skip_words = ['CURRICULUM', 'VITAE', 'resume'] text_lines = text.split('\n') name = '' # pdb.set_tra

我正在写一个函数,试图从简历中提取用户名

大多数情况下,第一行包含用户名,但有时我的学生也会在第一行写简历、简历标题。所以我想忽略这一行,检查下一行

如果在简历的前四行中没有跳过单词的行,则将其视为人名

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
在这里,我试图编写逻辑,但它没有正确工作。如果有第一行作为resume,甚至它给出了resume的名称

如何跳过包含跳过列表中任何单词的起始行并打印正确的名称


非常感谢您在这方面提供的帮助。

您的代码没有按预期的方式工作的主要原因是,只要任何一个跳过单词不在文本行中,函数就会返回

你需要的是基础知识方面的帮助,而不是这个问题的答案。尝试将代码粘贴到pythontutor.com中,逐行观察执行情况

  • 您的代码没有使用(也不需要)面向对象的方法。当函数
    def
    是在
    类中定义的方法时,将使用
    self
    参数。在函数定义中从不使用
    self
    ,这一事实表明,可以在类定义之外编写常规函数定义。删除
    self
    参数

  • 你不是在比较小写字母。您的代码将硬编码列表的项转换为小写,但文本参数仍保持原样。在
    skip_words
    常量中使用小写,并对传递给函数的文本调用
    lower
    ,而不是对常量调用
    lower

  • 如果遍历列表元素本身,Python代码通常可读性更高。使用变量来表示每个元素,而不是使用计数器来访问列表元素。这也就不需要使用
    if
    语句来检查前四行是否存在

  • 通常最好在函数中只使用一个
    return
    语句

  • break
    将退出
    for
    循环,我认为您打算
    继续
    ,这将跳过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 ''
    

代码未按预期方式运行的主要原因是,只要任何一个跳过字不在文本行中,函数就会返回

你需要的是基础知识方面的帮助,而不是这个问题的答案。尝试将代码粘贴到pythontutor.com中,逐行观察执行情况

  • 您的代码没有使用(也不需要)面向对象的方法。当函数
    def
    是在
    类中定义的方法时,将使用
    self
    参数。在函数定义中从不使用
    self
    ,这一事实表明,可以在类定义之外编写常规函数定义。删除
    self
    参数

  • 你不是在比较小写字母。您的代码将硬编码列表的项转换为小写,但文本参数仍保持原样。在
    skip_words
    常量中使用小写,并对传递给函数的文本调用
    lower
    ,而不是对常量调用
    lower

  • 如果遍历列表元素本身,Python代码通常可读性更高。使用变量来表示每个元素,而不是使用计数器来访问列表元素。这也就不需要使用
    if
    语句来检查前四行是否存在

  • 通常最好在函数中只使用一个
    return
    语句

  • break
    将退出
    for
    循环,我认为您打算
    继续
    ,这将跳过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 ''
    

你的问题是什么?@CarlosMonroyNieblas:对不起,更新了问题。请让我知道,如果仍然不清楚的文件,你正在搜索的名称的例子,将有助于产生更好的代码!你为什么要检查前4行?您说过,如果
跳过单词不在第一行,用户名在第一行,否则在第二行。@Nutmag64:有时第一行是“resume”,然后是少量新闻行,然后是name。这就是为什么我为四行设置了阈值你的问题是什么?@CarlosMonroyNieblas:对不起,更新了问题。请让我知道,如果仍然不清楚的文件,你正在搜索的名称的例子,将有助于产生更好的代码!你为什么要检查前4行?您说过,如果
跳过单词不在第一行,用户名在第一行,否则在第二行。@Nutmag64:有时第一行是“resume”,然后是少量新闻行,然后是name。这就是我为四行设置阈值的原因