我正在尝试构建一个脚本,该脚本会创建一个人名称的不同变体来测试其电子邮件。基本上,我希望脚本做的是:
如果我输入" 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")。
答案 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)))
在您的示例中,我未在示例中看到jms
,j.s
或js
。如果这是故意的,请随时澄清应该排除的内容。
供参考:输出为
>>> 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']