JMpro 2024-08-30 16:02 采纳率: 57.1%
浏览 4
已结题

Python处理Email是否合法的问题

题目:
给定一个Email地址,判断其是否合法。Email地址的格式要求如下:
(1)Email地址包含2个部分,分别是用户名和域名,中间用符号“@”分隔,且要求用户名和域名均至少有1个字符。
(2)用户名和域名只能由大小写字母、0至9的数字、下划线“_”或点号“.”组成。
(3)用户名和域名中的点号“.”都要求前后必须有其他合法的字符,如carter.chen@163.com是合法的,但carter.chen.@163.comcarter..chen@163.com是不合法的。
输入
输入数据包含多组,第一行为数据的组数T,接下来有T组数据,每组占一行,每行是一个字符串,长度不超过100个字符。
输出
如果是合法的Email地址,则输出Yes,否则输出No。

我i的代码:

import string
#函数判断address是否合法
legal_char = string.digits+string.ascii_letters+'_'+'.'
def judge_Address(addre):
    if len(addre) < 3 or addre[0]=='.' or addre[-1] == '.':
        return False
    for k in range(len(addre)):
        if addre[k] in legal_char:
            if addre[k] == '.':
                if addre[k-1] not in legal_char[:-1] and addre[k+1] not in legal_char[:-1]:
                    return False
        else:
            return False
    else:
        return True
t = int(input(''))
for i in range(t):
    addr = input('')
    f = judge_Address(addr)
    if f:
        print("Yes")
    else:
        print("No")

有人能告诉我哪里出现问题了吗?
万分感谢!!

  • 写回答

2条回答 默认 最新

  • 晴友读钟 2024-08-30 16:45
    关注

    你的代码在判断Email地址是否合法时存在一些问题。主要问题集中在以下几点:

    缺乏对“@”符号的处理:你没有检查字符串是否包含一个“@”,而且分隔出的用户名和域名是否符合要求。

    点号“.”的前后字符判断不够全面:你在点号的判断中只考虑了上一个和下一个字符,但没有考虑点号可能出现在用户名或域名的开头和结尾。

    合法字符的定义比较混乱:你在judge_Address函数中检查字符是否合法时,使用legal_char[:-1]来避免点号,但这个方式会导致逻辑错误。

    组合判断未处理用户和域名的分隔:在检查用户和域名时,需要用“@”将其分开,并分别调用验证函数。

    下面是具体改进后的代码示例:

    import string
    
    # 函数判断地址是否合法
    legal_char = string.digits + string.ascii_letters + '_' + '.'
    
    def is_valid_character(c):
        return c in legal_char
    
    def is_valid_segment(segment):
        if len(segment) < 1 or segment[0] == '.' or segment[-1] == '.':
            return False
        for i in range(len(segment)):
            if not is_valid_character(segment[i]):
                return False
            if segment[i] == '.':
                if (i == 0 or segment[i - 1] == '.') or (i == len(segment) - 1 or segment[i + 1] == '.'):
                    return False
        return True
    
    def judge_Address(email):
        if "@" not in email:
            return False
        
        username, domain = email.split("@", 1)
        
        return is_valid_segment(username) and is_valid_segment(domain)
    
    t = int(input())
    for i in range(t):
        addr = input().strip()
        if judge_Address(addr):
            print("Yes")
        else:
            print("No")
    
    

    改动说明:
    引入is_valid_character:用于判断单个字符是否合法。
    is_valid_segment函数:用于判断邮箱中的每个部分(用户名和域名)是否合法,包括点号的规则。
    使用split方法:通过“@”分隔用户名和域名,并检查这两部分是否都合法。
    这样修改之后,你的程序就应该能够正确判断输入的Email地址是否合法。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月15日
  • 已采纳回答 9月7日
  • 创建了问题 8月30日

悬赏问题

  • ¥15 paddle库安装时报错提示需要安装common、dual等库,安装了上面的库以后还是显示报错未安装,要怎么办呀?
  • ¥20 找能定制Python脚本的
  • ¥15 odoo17的分包重新供应路线如何设置?可从销售订单中实时直接触发采购订单或相关单据
  • ¥15 用C语言怎么判断字符串的输入是否符合设定?
  • ¥15 通信专业本科生论文选这两个哪个方向好研究呀
  • ¥50 我在一个购物网站的排队系统排队,这个排队到号后重新定向到目标网站进行购物,但是有技术牛通过技术方法直接跳过排队系统进入目标网址购物,有没有什么软件或者脚本可以用
  • ¥15 ios可以实现ymodem-1k协议 1024字节传输吗?
  • ¥300 寻抓云闪付tn组成网页付款链接
  • ¥15 请问Ubuntu要怎么安装chrome呀?
  • ¥15 视频编码 十六进制问题