用于单词列表的正则表达式过滤器,直到第 n 次出现字符

Posted

技术标签:

【中文标题】用于单词列表的正则表达式过滤器,直到第 n 次出现字符【英文标题】:regex filter for list of words until nth occurence of character 【发布时间】:2020-10-06 23:20:10 【问题描述】:

我有一个带有网址的数据框。我有一个用词过滤这些网址的黑名单。 不,我想过滤这些 url,直到第三次出现 /。 比如:

http://example.com/abc/def/

在这里我只想过滤到第三次出现/

所以只要: http://example.com/

我读了一些类似的问题,我想我需要结合两个正则表达式。

    /.*?/(.*?)/ 这应该完成过滤工作,直到第三次出现/

    为了过滤一个单词列表,我使用这个表达式:

mask = df["url"].str.contains(r'\b(?:)\b'.format('|'.join(blacklist)))
df_new = df[~mask]

现在我不知道如何组合这两个表达式。我是 Python 新手,尤其是正则表达式,所以可能还有更聪明的方法来完成这项任务。

谢谢。

编辑: 黑名单长这样:["ebay","shop","camping","car"]

Df 像这样:

url                             text
http://example.com/abc/def/     fdogjdfgfd
http://abcde.com/yzt/egd/        oijfgfdgdf
http://ebay.com/buy/something    fgfgeg

【问题讨论】:

给出你的黑名单词的例子以及数据框中的几个url。 【参考方案1】:

您可以先extract 的部分网址直到第三个'/',然后在此使用您的逻辑:

mask = df["url"].str.extract(r'((?:[^/]*/[^/]*),3)').str.contains(r'\b(?:)\b'.format('|'.join(blacklist)))

【讨论】:

【参考方案2】:

Series.str.contains 与给定的正则表达式模式一起使用:

pattern = '|'.join(rf'(?://[^/]*?b[^/]+)' for b in blacklist)
m = df['url'].str.contains(pattern, case=False)
df = df[~m]

# print(df)
                           url        text
0  http://example.com/abc/def/  fdogjdfgfd
1    http://abcde.com/yzt/egd/  oijfgfdgdf

您可以测试正则表达式here

【讨论】:

以上是关于用于单词列表的正则表达式过滤器,直到第 n 次出现字符的主要内容,如果未能解决你的问题,请参考以下文章

必须通过剥离符号 ^ 字符的最后一次出现以通过正则表达式提取结束来提取单词的开头

正则表达式从列表中选择第 n 个值,允许空值

Python正则表达式详解

JavaScript 正则表达式仅选择最后一次出现

正则表达式匹配替换第n次出现

正则表达式