Python - 用于电子邮件检查的名称解析

时间:2017-01-24 19:22:38

标签: python string parsing combinations

我正在尝试构建一个脚本,该脚本会创建一个人名称的不同变体来测试其电子邮件。基本上,我希望脚本做的是:

  • 如果我输入" John Smith"我需要回复一个包含[john, johnsmith, john.smith, john_smith, smith, jsmith, j.smith, smithj, smith.j, j_smith, smith_j,smithjohn, smith.john, smith_john, etc]

  • 的列表
  • 如果我输入" John May Smith"我需要获得包含[john, johnmay, johnsmith, john.may, john.smith, john_may, john_smith, jmay, jsmith, j.may, j.smith, j_may, j_smith, johnmaysmith, john.may.smith, john_may_smith, jms, johnms, john.m.s, john_m_s, jmsmith, j.m.smith, j_m_smith, j.m.s, j_m_s, jmays, j.may.s, j_may_s, etc]的列表。从技术上讲,它将是三个名称部分列表:[j, john][m, may][s, smith],它们将以不同的顺序混合,而部分可以通过"分开或不分开。"或" _"。

  • John Smith和John May Smith只是一个例子,我应该可以输入任何名称,分解它并混合它的部分,首字母和分隔符('。'和' _'。)

使用以下内容分解名称:

import nameparser 
name="John May Smith"
name=nameparser.HumanName(name)

parts=[]
for i in name:
    j=[i[0],i]
    parts.append(j)

这样parts就是这样:

[['j', 'john'], ['m', 'may'], ['s', 'smith']]

请注意,此案例中的列表有三个子列表,但它可能是2,4,5或6。

我创建了另一个名为分隔符的列表:

separators=['.','_']

我的问题是: 如上例所示,混合这些列表以创建可能的电子邮件本地部分*的列表的最佳方法是什么?我已经烧了我的大脑,想要找到一种方法来做几天但是还没有能力。

*本地部分是@之前的部分(在jmaysmith@apple.com,本地部分是" jmaysmith")。

1 个答案:

答案 0 :(得分:1)

以下代码应该做你想做的事情

from nameparser import HumanName
from itertools  import product, chain, combinations

def name_combinations(name):
    name=HumanName(name)

    parts=[]
    ret=[]
    for i in name:
        j=[i[0].lower(),i.lower()]
        ret.append(i.lower())
        parts.append(j)

    separators=['','.','_']
    for r in range(2,len(parts)+1):
        for c in combinations(parts,r):
            ret = chain(ret,map(lambda l: l[0].join(l[1:]),product(separators,*c)))
    return ret

print(list(name_combinations(name)))

在您的示例中,我未在示例中看到jmsj.sjs。如果这是故意的,请随时澄清应该排除的内容。

供参考:输出为

>>> print(list(name_combinations("John Smith")))
['john', 'smith', 'js', 'jsmith', 'johns', 'johnsmith', 'j.s', 'j.smith', 'john.s', 'john.smith', 'j_s', 'j_smith', 'john_s', 'john_smith']
>>> print(list(name_combinations("John May Smith")))
['john', 'may', 'smith', 'jm', 'jmay', 'johnm', 'johnmay', 'j.m', 'j.may', 'john.m', 'john.may', 'j_m', 'j_may', 'john_m', 'john_may', 'js', 'jsmith', 'johns', 'johnsmith', 'j.s', 'j.smith', 'john.s', 'john.smith', 'j_s', 'j_smith', 'john_s', 'john_smith', 'ms', 'msmith', 'mays', 'maysmith', 'm.s', 'm.smith', 'may.s', 'may.smith', 'm_s', 'm_smith', 'may_s', 'may_smith', 'jms', 'jmsmith', 'jmays', 'jmaysmith', 'johnms', 'johnmsmith', 'johnmays', 'johnmaysmith', 'j.m.s', 'j.m.smith', 'j.may.s', 'j.may.smith', 'john.m.s', 'john.m.smith', 'john.may.s', 'john.may.smith', 'j_m_s', 'j_m_smith', 'j_may_s', 'j_may_smith', 'john_m_s', 'john_m_smith', 'john_may_s', 'john_may_smith']