我想要一个正则表达式来解决这个问题。
我已经解决了Hackerrank Validating Email Addresses With a Filter
中的问题这是我的解决方案:
def fun(s):
if s.count('@')==1 and s.count('.')==1:
username, websites = s.split('@')
website, extension = websites.split('.')
if not (len(username)>0 and len(website)>0 and website.isalnum() and len(extension)<=3):
return False
for i in username:
if not (i.isalpha() or i.isdigit() or i in ['-','_']):
return False
return True
return False
我发现可以使用正则表达式来完成。
有人可以帮我吗?
答案 0 :(得分:2)
import re
def fun(s):
emailed=[]
if bool(re.match(r'^([a-z0-9_\-]+)@([a-z0-9]+)\.([a-z]{1,3})$',s)):
emailed.append(s)
elif s=='':
return []
return sorted(emailed)
def filter_mail(emails):
return list(filter(fun, emails))
if __name__ == '__main__':
n = int(input())
emails = []
for _ in range(n):
emails.append(input())
filtered_emails = filter_mail(emails)
filtered_emails.sort()
print(filtered_emails)
答案 1 :(得分:1)
应该注意的是,使用正则表达式匹配通用邮件地址可能非常困难,而且看起来并不简单。
但是,此挑战的规则将其简化了很多:
- 它必须具有
username@websitename.extension
格式类型。- 用户名只能包含字母,数字,破折号和下划线。
- 网站名称只能包含字母和数字。
- 扩展名的最大长度为3。
正则表达式示例为^[\w-]+@[a-zA-Z\d]+\..{,3}$
答案 2 :(得分:0)
规则似乎有点奇怪(扩展名可以是任何东西,只要它的长度最大为3?)。不过,'[\w\d-]+@[A-Za-z\d]\..{1,3}$'
应该可以工作。
注意:您需要$
(代表字符串的结尾),否则,您将匹配任何扩展名超过3个字母的电子邮件地址,我相信,这个问题的目的是错误的。