python re.match正则表达式列表

时间:2017-08-18 20:05:57

标签: python regex

我有两个列表:ignorelist是一个正则表达式列表,另一个列表叫urllist。我试图这样做,如果urllist中的索引项与ignorelist中的正则表达式匹配,则不会将其添加到finallist

ignorelist = ['(?:\.)amazon\.com(?:\/(?:.*))',
            '(?:\.)google\.com(?:\/(?:.*))']

urllist = ['api.amazon.com/', 'fakedomain.com/']
finallist = []

for r in ignorelist:
    r = re.compile(r)
    finallist = [x for x in urllist if not r.match(x)]

输出

['api.amazon.com/', 'fakedomain.com/']

我试图使输出基本上为['fakedomain.com/'],因为它与ignorelist中的正则表达式不匹配

2 个答案:

答案 0 :(得分:2)

这里有几个问题:

  • re.match在该行的开头搜索。您的表达式不是为此而构建的。使用re.search
  • 你在循环中分配结果:错误的逻辑。

我愿意:

import re

ignorelist = ['(?:\.)amazon\.com(?:\/(?:.*))',
            '(?:\.)google\.com(?:\/(?:.*))']

urllist = ['api.amazon.com/', 'fakedomain.com/']


finallist = [x for x in urllist if not any(re.search(r,x) for r in ignorelist)]

因此finallist仅包含与ignorelist

的任何正则表达不匹配的网址

结果:

['fakedomain.com/']

请注意,我没有“编译”正则表达式,但在测试很多域时,您可能会获得一些速度。

答案 1 :(得分:1)

您正在过滤忽略列表的每个正则表达式,然后每次重新分配var folder; var nodes = search.luceneSearch("PATH:\"/app:company_home/app:dictionary/cm:StarXpert_x0020_Workflow\""); folder = nodes[0]; 。因此,只考虑最后一个正则表达式。

finallist

或使用列表理解:

finallist = []
for url in urllist:
    if any([re.search(r, url) for r in ignorelist]):
       finallist.append(url)

See the working demo.