当我遇到可调用迭代器问题时,如何在此正则表达式代码上使用group方法?

2024-04-28 08:03:06 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我试图在30天的代码黑客挑战中解决一些代码问题。如果输入的邮件是gmail.com,我必须返回输入的名字。例如,输入可能是:

(数字指定程序的输入行数。)

6
riya riya@gmail.com
julia julia@julia.me
julia sjulia@gmail.com
julia julia@gmail.com
samantha samantha@gmail.com
tanya tanya@gmail.com

输出结果将如下所示

riya
julia
julia
samantha
tanya

我编写了以下代码来尝试处理此问题:

import math
import os
import random
import re
import sys


if __name__ == '__main__':
    N = int(input().strip())
    
    pattern = re.compile(r'([a-zA-Z]@gmail\.com)')

    for N_itr in range(N):
        first_multiple_input = input().rstrip().split()

        firstName = first_multiple_input[0]

        emailID = first_multiple_input[1]
        
        matches = pattern.finditer(emailID)
        
        if matches.group(0):
            print(firstName)

但当我运行代码时,会收到一条错误消息:

Traceback (most recent call last):
  File "Solution.py", line 25, in <module>
    if matches.group(0):
AttributeError: 'callable_iterator' object has no attribute 'group'

我在Stack Overflow上看到了类似的问题,但我无法理解答案,这是我第一次使用regex,我正在网上观看视频(因为我是自学的)。我怎样才能解决这个问题


1条回答
网友
1楼 · 发布于 2024-04-28 08:03:06

这里不需要正则表达式(或math,或random,或os

import sys

number = int(sys.stdin.__next__())

for idx, line in enumerate(sys.stdin):
    if idx > number:
        break
    if '@gmail.com' not in line:
        next
    print(line.split()[0])

这并不完全等同于您的代码,因为我们不检查@字符前面的内容。如果你想这样做,你应该真正检查Gmail允许什么(例如,我认为他们会允许那里有数字,可能还有一个点,可能还有一些其他字符,如下划线等)

如果您真的想使用正则表达式,可能不要使用finditer,因为它会返回match对象的列表。如果您只关心第一个匹配,只需使用re.search();然后,如果存在匹配项,结果将是一个match对象,您可以调用它的.group()方法

这也不完全等同于您的代码,因为如果输入行少于第一行承诺的输入行,那么它不会失败。添加一个检查应该很容易,而且可能是一个很好的练习

如果您的文件不包含函数,if __name__ == '__main__':检查是没有意义的。它的目的是允许另一个Python模块import这个模块,但是如果它不包含任何可以有效地import编辑的内容,那么无论如何,您都不会希望这样做。(更详细地说,当您import这个文件时,__name__将不会被__main__,因此所有这些代码都将被丢弃。您希望在其中放入尽可能少的代码,如果您关心代码的可重用性,请将所有有用的代码放入类和函数中。)

相关问题 更多 >