我的输入是这个数据框(但它可以是一个简单的列表):
import pandas as pd
df = pd.DataFrame({'description': ['ij edf m-nop ij abc', 'abc ij mnop yz', 'yz yz mnop aa abc', 'i j y y abc xxx mnop y z', 'yz mnop ij kl abc uvwxyz', 'aaabc ijij uuu yz mnop']})
我也有一个列表的关键字(3到7个项目),我需要有效.我们应该只验证整个关键字的精确组合,忽略中间的字符.问题是,这些关键字不尊重我把它们放在我的列表中的顺序(这里是keywords
).
我在谷歌和这里搜索过,但找不到任何关于类似主题的帖子.因此,我编写了下面的代码,它是对关键字进行置换,并将它们放在正则表达式字符串中.
import re
import itertools
keywords = ['abc', 'ij', 'mnop', 'yz']
regex = ''
for perm in list(itertools.permutations(keywords)):
perm = [fr'\b{key}\b' for key in perm]
regex += f'(?:{".*".join(perm)})|'
regex = regex.rstrip('|')
下面是我的regex的一个片段:
# (?:\babc\b.*\bij\b.*\bmnop\b.*\byz\b)|(?:\babc\b.*\bij\b.*\byz\b.*\bmnop\b)|(?:\
# babc\b.*\bmnop\b.*\bij\b.*\byz\b)|(?:\babc\b.*\bmnop\b.*\byz\b.*\bij\b)|(?:\babc
# \b.*\byz\b.*\bij\b.*\bmnop\b)|(?:\babc\b.*\byz\b.*\bmnop\b.*\bij\b)|(?:\bij\b.*\
# babc\b.*\bmnop\b.*\byz\b)|(?:\bij\b.*\babc\b.*\byz\b.*\bmnop\b)|(?:\bij\b.*\bmno
# p\b.*\babc\b.*\byz\b)|(?:\bij\b.*\bmnop\b.*\byz\b.*\babc\b)|(?:\bij\b.*\byz\b.*\
# babc\b.*\bmnop\b)|(?:\bij\b.*\byz\b.*\bmnop\b.*\babc\b)|(?:\bmnop\b.*\babc\b.*\b
# ij\b.*\byz\b)|(?:\bmnop\b.*\babc\b.*\byz\b.*\bij\b)|(?:\bmnop\b.*\bij\b.*\babc\b
# .*\byz\b)|(?:\bmnop\b.*\bij\b.*\byz\b.*\babc\b)|(?:\bmnop\b.*\byz\b.*\babc\b.*\b
# ij\b)|(?:\bmnop\b.*\byz\b.*\bij\b.*\babc\b)|(?:\byz\b.*\babc\b.*\bij\b.*\bmnop\b
# )|(?:\byz\b.*\babc\b.*\bmnop\b.*\bij\b)|(?:\byz\b.*\bij\b.*\babc\b.*\bmnop\b)|(?
# :\byz\b.*\bij\b.*\bmnop\b.*\babc\b)|(?:\byz\b.*\bmnop\b.*\babc\b.*\bij\b)|(?:\by
# z\b.*\bmnop\b.*\bij\b.*\babc\b)
虽然它适用于我给出的示例,但在我的真实数据集(50k行和非常长的带有特征线的描述)上需要5—15分钟,我不确定我的方法是否正确处理了所有行.还有一个问题,有时我不得不验证一个列表6关键字,这给出720置换!
你们能帮我解决这个问题吗?regex是解决问题的正确方法吗?
我的期望是这样的:
description valid
0 ij edf m-nop ij abc
1 abc ij mnop yz True
2 yz yz mnop aa abc
3 i j y y abc xxx mnop y z
4 yz mnop ij kl abc uvwxyz True
5 aaabc ijij uuu yz mnop