正确地将名字映射到电子邮件?

时间:2014-04-24 00:48:28

标签: python regex iterator

我正在研究一个研究项目,我有一个约200个名字和6个电子邮件地址的列表。要求是根据此要求将每封电子邮件地址映射到一个电子邮件地址:

“以A,B,C,D,E开头的名称将映射到email1.F,G,H,I,J将映射到email2”,依此类推。

现在我正在考虑一种方法,将这些名称映射到特定的电子邮件,方式为“if name AE 开头,然后 email1 ,而不是遍历所有名称并检查每个名称的起始字母。有没有办法实现这一点?我认为RegEx可能有所帮助,但不确定究竟是怎么回事(可能是^[a-eA-E]?)

3 个答案:

答案 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. 您可以在此处添加更多正则表达式模式。
  2. Scanner类初始化为2元组列表。每 2元组由正则表达式模式和相关的回调组成 功能

答案 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()预编译正则表达式,但是为了快速而肮脏的解决方案,这可以完成工作。