0

我正在寻找通过另一个停止列表过滤一个列表的不错的 Pythonic 方式,但我想首先匹配第二个列表中的子字符串。

具体来说:我有 URL 列表 1 和列表 2,例如:

['microsoft.com', 'ibm.com', 'cnn', '.ru'] etc

第一个 URL 列表很大(数千个项目),第二个列表较小,例如 500-1000。但是使用“in”或集合的简单匹配是不够的,因为第二个列表项应该用作子字符串搜索。我能想到的只是两个“for”循环,但它们似乎不是pythonic :)

PS 目的是从第一个列表中删除匹配的项目。

4

2 回答 2

3

您可以从要匹配的字符串中构建一个单独的、分离的正则表达式,然后使用searchRE 对象的方法进行匹配。re.escape在将字符串粘贴到 RE 中之前,请确保字符串。

>>> import re
>>> substrings = ['microsoft.com', 'ibm.com', 'cnn', '.ru']
>>> pattern = "(?:%s)" % "|".join(map(re.escape, substrings))
>>> print(pattern)
(?:microsoft\.com|ibm\.com|cnn|\.ru)
>>> pattern = re.compile(pattern)
>>> [x for x in ["www.microsoft.com", "example.com", "foo.ru"]
...    if not pattern.search(x)]
['example.com']
于 2012-04-24T09:53:42.767 回答
0

这是你所期望的吗?

one=['microsoft.com', 'ibm.com', 'cnn', '.ru']
two=['.com']
filtered=[o for o in one for t in two if o.find(t)!=-1]
于 2012-04-24T09:56:21.467 回答