如何使 re.finditer 只返回每行一次

Posted

技术标签:

【中文标题】如何使 re.finditer 只返回每行一次【英文标题】:How do I make re.finditer only return each line once 【发布时间】:2022-01-13 17:36:26 【问题描述】:

我正在搜索一个文本文件,它是一个“phoneBook”的作业,并且正在使用正则表达式查找器,但如果一个名称中有两次字母 a,它会打印该行两次,这是我试图避免的。还有没有办法让它忽略大小写?

def searchPhonebook(s): #This will search the phonebook(s) for the inputed data that is assigned to d
    print()
    d=input("Please enter the Name, Character, Phone Number, or a number: ") #Variable d which is the inputted data
    print()
    import re
    pattern = re.compile(d)
    for line in open("phone.txt"):
        for match in re.finditer(pattern,line):
            print(line)

所以当我搜索“a”时它会返回

Jack Hammer,277-4829
Jack Hammer,277-4829
Mike Rafone,345-3453
Earl Lee Riser,701-304-8293

所以我希望它每一个都返回一次,并且像 Abby 一样找到 'a' 的大写

【问题讨论】:

使用re.search,而不是re.findall 这会产生“对象不可迭代”的错误 【参考方案1】:

不要使用findall()。只需测试该行是否与模式匹配:

for line in open("phone.txt"):
    if re.search(pattern, line):
        print(line)

实际上,我完全不确定您为什么要使用 re。您的用户是否真的输入了正则表达式模式?如果他们只是输入纯字符串,请使用if d in line:

【讨论】:

谢谢,就像我说的我还是个学生,有没有办法让它忽略大小写,所以它会返回像 Abby 这样的结果? if d.lower() in line.lower(): 谢谢,这对我帮助很大,我之前尝试过但没有成功(可能是我在列表中打开了文件),再次谢谢,我会标记一次正确能

以上是关于如何使 re.finditer 只返回每行一次的主要内容,如果未能解决你的问题,请参考以下文章

python 生成器:生成器基础惰性实现

是否有 Python 的 re.findall/re.finditer(迭代正则表达式结果)的 Perl 等价物?

Python3正则匹配re.split,re.finditer及re.findall函数用法详解

re匹配

Re.findall() & Re.finditer()的用法

re库