我正在研究一个研究项目,我有一个约200个名字和6个电子邮件地址的列表。要求是根据此要求将每封电子邮件地址映射到一个电子邮件地址:
“以A,B,C,D,E开头的名称将映射到email1.F,G,H,I,J将映射到email2”,依此类推。
现在我正在考虑一种方法,将这些名称映射到特定的电子邮件,方式为“if name 以 AE 开头,然后 email1 ,而不是遍历所有名称并检查每个名称的起始字母。有没有办法实现这一点?我认为RegEx可能有所帮助,但不确定究竟是怎么回事(可能是^[a-eA-E]
?)
答案 0 :(得分:4)
re
模块有一个未记录的Scanner class,可用于将任意函数调用附加到正则表达式模式。调用Scanner.scan
方法时,提供的文本将与每个正则表达式模式匹配,并在找到匹配项时调用关联的函数。当剩余文本与任何模式都不匹配时,扫描方法结束。
import re
def make_email(i):
def email(scanner, token):
print('{t}: Send to email{i}'.format(t=token, i=i))
return email
scanner = re.Scanner(
[(pat, make_email(i)) # 2
for i, pat in enumerate((r"^[a-e]\w+", r"^[f-j]\w+"))] # 1
+ [(r"\s+", None)],
flags=re.IGNORECASE|re.MULTILINE)
scanner.scan("""\
Albert
Barry
Carrie
David
Erin
Franklin
Geoff
Harold
Isadore
Jay""")
打印
Albert: Send to email0
Barry: Send to email0
Carrie: Send to email0
David: Send to email0
Erin: Send to email0
Franklin: Send to email1
Geoff: Send to email1
Harold: Send to email1
Isadore: Send to email1
Jay: Send to email1
答案 1 :(得分:0)
您只需知道每个名字中的第一个字母,并将其映射到电子邮件地址即可。你不需要正则表达式。
def address(name):
addresses = ['foo@bar.com', 'spam@eggs.org', ... ]
i = 'abcdefghijklmnopqrstuvwxyz'.find(name[0].lower()) // 5
return addresses[i]
然后你希望迭代这些名字。
for name in names: print(name, address(name))
答案 2 :(得分:0)
简单直接的解决方案是创建一个以正则表达式作为键的简单字典,然后循环遍历这些字典。
import re
mappings = { r'^[a-e]': "email0", r'^[f-j]': "email1" }
for name in names:
for regex in mappings:
if re.match(regex, name, flags=re.IGNORECASE):
print "%s: send to %s" % (name, mappings[regex])
break
else:
print "%s: no match" % name
如果您在工业规模上执行此操作,您可能希望使用re.compile()
预编译正则表达式,但是为了快速而肮脏的解决方案,这可以完成工作。