用于从列表中查找和排除多个匹配的逻辑

Ari*_*ury 3 python logic

我需要将列表的内容与给定的模式匹配,并形成另一个列表,除了匹配之外,它将包含所有内容.意思是,我正在尝试制作排除列表.

现在有一个模式匹配,很容易.但是对于更多那个,它变得棘手.

让我们看一个例子:

Lmain=[arc123, arc234,xyz111,xyz222,ppp999,ppp888]

for count in range(len[Lmain]):

    if Pattern matches Lmain[i]:
              Pass
    else:result.append(Lmain[i])
Run Code Online (Sandbox Code Playgroud)

现在让我们说pattern = arc,我的结果就是

result = [xyz111,xyz222,ppp999,ppp888]
Run Code Online (Sandbox Code Playgroud)

这只是一个逻辑,我将使用常规expr来查找匹配.

现在,如果我们有2个模式,那么在循环中使用上面的逻辑:

Pattern=['arc','xyz']

for pat in Pattern:
      if pat matches Lmain[i]:
          Pass
      else:result.append(Lmain[i])
Run Code Online (Sandbox Code Playgroud)

这会给我们错误的结果

result = [xyz111,xyz222,ppp999,ppp888,arc123,arc234,ppp999,ppp888]
Run Code Online (Sandbox Code Playgroud)

所以,你可以看到上面的逻辑不会起作用.

我的计划:

首先,我们找到第一个Pattern的排除列表,它将给出结果:

result = [xyz111,xyz222,ppp999,ppp888]
Run Code Online (Sandbox Code Playgroud)

对于第二种模式,我们需要查看上述结果.

if Pattern matches Result[i]:
      Pass
else:result_final.append(Result[i])
Run Code Online (Sandbox Code Playgroud)

我认为我们需要使用Recursion来实现上面的逻辑.现在我们该怎么做?此外,我们不知道用户将要进入的模式数量.它可以是一个或多个.

任何人都有任何逻辑思想,请分享.

Woo*_*ble 5

使用列表推导和生成器表达式,并跳过构建排除列表和仅构建最终列表的中间步骤:

>>> import re
>>> Lmain=['arc123', 'arc234', 'xyz111', 'xyz222','ppp999','ppp888']
>>> Pattern=['arc','xyz']
>>> [x for x in Lmain if not any(re.search(y, x) for y in Pattern)]
['ppp999', 'ppp888']
Run Code Online (Sandbox Code Playgroud)