我有一个名称列表,用于从目标字符串列表中提取出来。例如:
names = ['Chris', 'Jack', 'Kim']
target = ['Chris Smith', 'I hijacked this thread', 'Kim','Christmas is here', 'CHRIS']
output = ['Chris Smith', 'Kim', 'CHRIS']
所以到目前为止的规则是:
- 不区分大小写
- 无法匹配部分单词('ie Christmas/hijacked 不应该匹配 Chris/Jack)
- 只要根据上述条件在字符串中找到名称,字符串中的其他单词就可以了。
为此,另一位 SO 用户在此线程中建议了此代码:
[targ for targ in target_list if any(re.search(r'\b{}\b'.format(name), targ, re.I) for name in first_names)]
到目前为止,这非常准确,但是考虑到名称列表的长度约为 5,000 并且目标列表的长度范围为 20-100 行,其中一些字符串最长为 30 个字符,因此运行速度非常慢。
关于如何在这里提高性能的任何建议?
解决方案:两种基于正则表达式的解决方案都遭受了溢出错误,所以很遗憾我无法测试它们。有效的解决方案(来自@mglison 的回答)是:
new_names = set(name.lower() for name in names)
[ t for t in target if any(map(new_names.__contains__,t.lower().split())) ]
这将性能从 15 秒大幅提高到不到 1 秒。