如何对first.last@domain.com格式邮件列表去重、转驼峰式?
问题解决:提取唯一邮箱用户名并转换为CamelCase格式
核心问题分析
- TypeError 触发原因:你在调用
re.match时传入了列表dup_email_list,但正则匹配函数要求传入字符串类型的单个对象,而非列表。 - 用户名提取逻辑错误:原正则表达式
[a-z]{1}[.]{1}[a-z]{1}只能匹配单个字母+点+单个字母的片段,无法完整提取first.last格式的用户名。 - 去重效率低:原代码用循环判断去重,不如直接用Python集合自动去重简洁高效。
- CamelCase转换逻辑混乱:原代码存在未定义变量
i、语法错误len.update_list[i]等问题,且未正确拆分用户名进行格式转换。
修正后的完整代码
import re email_list = [] domain_gmail = [] domain_outlook = [] # 收集邮箱输入 while True: input_string = input('输入名、姓、9位ID和邮箱域名(用逗号分隔,输入done结束): ') if input_string.strip().lower() == 'done': break input_list = [x.strip() for x in input_string.split(',')] # 校验输入格式是否完整 if len(input_list) != 4: print('输入格式错误,请按要求输入:名, 姓, ID, 域名') continue first_name, last_name, user_id, domain = input_list # 校验ID有效性 if not (user_id.isdigit() and len(user_id) == 9): print('ID无效,必须是9位数字') continue # 校验域名有效性 if domain not in ['gmail', 'outlook']: print('域名无效,只能是gmail或outlook') continue # 生成邮箱并转小写 email = f"{first_name.lower()}.{last_name.lower()}@{domain}.com" email_list.append(email) # 按域名分类 if domain == 'gmail': domain_gmail.append(email) else: domain_outlook.append(email) # 去重处理:用集合自动去重后转列表 unique_emails = list(set(email_list)) unique_gmail = list(set(domain_gmail)) unique_outlook = list(set(domain_outlook)) # 提取唯一用户名到update_list update_list = [] for email in unique_emails: # 方法1:用split截取@前的部分(简洁高效) username = email.split('@')[0] # 方法2:用正则捕获(可选,适合复杂格式) # match_result = re.match(r'^(.+)@', email) # if match_result: # username = match_result.group(1) update_list.append(username) # 转换为CamelCase格式 camel_list = [] for username in update_list: first, last = username.split('.') camel_case = first.capitalize() + last.capitalize() camel_list.append(camel_case) # 输出结果 print('去重后的邮箱列表:', unique_emails) print('按域名分组:', f'Gmail: {unique_gmail}', f'Outlook: {unique_outlook}', sep='\n') print('提取的唯一用户名:', update_list) print('CamelCase格式列表:', camel_list)
关键优化点
- 输入校验逻辑优化:增加输入格式完整性校验,避免索引越界错误。
- 自动去重:利用集合
set()的特性,一行代码完成去重,替代原循环判断。 - 用户名提取:用
split('@')[0]简单高效截取用户名,正则方案作为复杂格式场景的可选补充。 - CamelCase转换:拆分用户名后,用
capitalize()方法将每个部分首字母大写,直接拼接成目标格式。
内容的提问来源于stack exchange,提问作者Crimson
相关产品推荐
相关产品推荐

