Pandas和“重新”搜索全部和部分字符串

2024-04-23 09:35:20 发布

您现在位置:Python中文网/ 问答频道 /正文

这是来自this topic的扩展问题。我想在字符串中搜索全部和部分字符串,如以下关键字系列“w”:

rigour*
*demeanour*
centre*
*arbour
fulfil

这显然意味着我想搜索“严谨”和“严谨”sen风度和风度s,中心和中心sharbour和arbour,并实现。所以我的关键字列表是完整字符串和部分字符串的混合。我想对这个数据帧“df”应用搜索:

^{pr2}$

到目前为止,我尝试的是:

r = re.compile(r'.*({}).*'.format('|'.join(w.values)), re.IGNORECASE)

然后我构建了一个掩码来过滤数据帧:

mask = [m.group(1) if m else None for m in map(r.search, df['Tweet'])]

要获取关键字为found的新列:

df['keyword'] = mask

我所期望的是以下结果数据帧:

ID;name;keyword
01;rigour;rigour
02;rigours;rigour
03;endemeanour;demeanour
04;endemeanours;demeanour
05;centre;centre
06;centres;centre
07;encentre;None
08;fulfil;fulfil
09;fulfill;None
10;harbour;arbour
11;arbour;arbour
12;harbours;None

这可以使用不带*的w列表。为了运行重新编译功能正常。在

任何帮助都将不胜感激。在


Tags: 数据字符串renonedf列表关键字中心
1条回答
网友
1楼 · 发布于 2024-04-23 09:35:20

看起来您的输入序列w需要调整以用作regex模式,如下所示:

rigour.*
.*demeanour.*
centre.*
\\b.*arbour\\b
\\bfulfil\\b

注意,regex中的*跟在它自己无法工作的东西后面。这意味着接下来的一切都可以重复0次或更多次。

还要注意,fulfilfulfill的一部分,如果您想要严格匹配,则需要告诉regex这一点。例如,通过使用'word separator'-\b-它将只捕获整个字符串。

以下是您的正则表达式可能会给您提供所需结果的外观:

^{pr2}$

您的代码可以用pandas.where方法进行替换,如下所示:

df['keyword'] = df.name.where(df.name.str.match(r), None)
df

            ID          name       keyword
        0    1        rigour        rigour
        1    2       rigours       rigours
        2    3   endemeanour   endemeanour
        3    4  endemeanours  endemeanours
        4    5        centre        centre
        5    6       centres       centres
        6    7      encentre          None
        7    8        fulfil        fulfil
        8    9       fulfill          None
        9   10       harbour       harbour
        10  11        arbour        arbour
        11  12      harbours          None

相关问题 更多 >