7

我正在尝试查看是否可以使用列表推导来更好地编写此代码。
可以说我有以下列表:

a_list = [
        'HELLO',
        'FOO',
        'FO1BAR',
        'ROOBAR',
        'SHOEBAR'
        ]

regex_list =   [lambda x: re.search(r'FOO', x, re.IGNORECASE),
                lambda x: re.search(r'RO', x, re.IGNORECASE)]

我基本上想将所有没有任何匹配项的元素添加regex_list到另一个列表中。

例如 ==>

newlist = []
for each in a_list:
    for regex in regex_list:
        if(regex(each) == None):
            newlist.append(each)

如何使用列表推导来做到这一点?甚至可能吗?

4

2 回答 2

18

当然,我认为应该这样做

newlist = [s for s in a_list if not any(r(s) for r in regex_list)]

编辑:仔细检查后,我注意到您的示例代码实际上将每个a_list不匹配所有正则表达式的字符串添加到新列表中 - 而且,它为每个不匹配的正则表达式添加每个字符串一次。我的列表理解符合我的意思,即每个字符串只添加一个与任何正则表达式都不匹配的副本。

于 2009-05-05T19:02:28.990 回答
0

我会将您的代码简化为:

a_list = [
          'HELLO',
          'FOO',
          'FO1BAR',
          'ROOBAR',
          'SHOEBAR'
          ]
regex_func = lambda x: not re.search(r'(FOO|RO)', x, re.IGNORECASE)    

然后你有两个选择:

  1. 筛选

    newlist = filter(regex_func, a_list)

  2. 列表推导

    newlist = [x for x in a_list if regex_func(x)]

于 2009-05-05T19:14:04.097 回答