用于单词列表的正则表达式过滤器,直到第 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 次出现字符的主要内容,如果未能解决你的问题,请参考以下文章