我的输入是这个数据框(但它可以是一个简单的列表):

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

推荐答案

正则表达式可能是有用的,但生成所有排列并不合适.

我将使用正则表达式来提取单词,然后判断关键字是否为提取的单词的子集,其中包含set.issubset:

import re

keywords = {'abc', 'ij', 'mnop', 'yz'} # this is a SET

reg = re.compile(r'\b[a-z]+\b', flags=re.I)

df['valid'] = [keywords.issubset(reg.findall(x)) for x in df['description']]

NB. you might want to add a 100 step to ignore case.

输出:

                description  valid
0       ij edf m-nop ij abc  False
1            abc ij mnop yz   True
2         yz yz mnop aa abc  False
3  i j y y abc xxx mnop y z  False
4  yz mnop ij kl abc uvwxyz   True
5    aaabc ijij uuu yz mnop  False

为了好玩,通过调整代码,你甚至可以得到一组缺失的单词而不是False个:

df['valid'] = [keywords.issubset(S:=set(reg.findall(x))) or keywords-S
               for x in df['description']]

                description       valid
0       ij edf m-nop ij abc  {mnop, yz}
1            abc ij mnop yz        True
2         yz yz mnop aa abc        {ij}
3  i j y y abc xxx mnop y z    {yz, ij}
4  yz mnop ij kl abc uvwxyz        True
5    aaabc ijij uuu yz mnop   {abc, ij}

# or
df['missing'] = [keywords-set(reg.findall(x)) for x in df['description']]
df['valid'] = df['missing'].eq(set())

                description     missing  valid
0       ij edf m-nop ij abc  {mnop, yz}  False
1            abc ij mnop yz          {}   True
2         yz yz mnop aa abc        {ij}  False
3  i j y y abc xxx mnop y z    {yz, ij}  False
4  yz mnop ij kl abc uvwxyz          {}   True
5    aaabc ijij uuu yz mnop   {abc, ij}  False

Python相关问答推荐

TARete错误:类型对象任务没有属性模型'

滚动和,句号来自Pandas列

难以在Manim中正确定位对象

标题:如何在Python中使用嵌套饼图可视化分层数据?

如何标记Spacy中不包含特定符号的单词?

如何在polars(pythonapi)中解构嵌套 struct ?

给定高度约束的旋转角解析求解

mypy无法推断类型参数.List和Iterable的区别

在www.example.com中使用`package_data`包含不包含__init__. py的非Python文件

寻找Regex模式返回与我当前函数类似的结果

处理Gekko的非最优解

在Django中重命名我的表后,旧表中的项目不会被移动或删除

我可以不带视频系统的pygame,只用于游戏手柄输入吗?''

Python OPCUA,modbus通信代码运行3小时后出现RuntimeError

操作布尔值的Series时出现索引问题

有了Gekko,可以创建子模型或将模型合并在一起吗?

将数据从一个单元格保存到Jupyter笔记本中的下一个单元格

函数()参数';代码';必须是代码而不是字符串

来自任务调度程序的作为系统的Python文件

Python:在cmd中添加参数时的语法