搜索两个正则表达式匹配列表,如果存在则弹出

时间:2018-01-30 15:16:13

标签: python

我有两个列表

list_one = ['aaa1a', 'bbb21ba', 'ccc4ba', 'qqq55ca']
list_two = ['eee21a', 'sws21ba', 'pop4ba', 'qqq55de']

最后一个数字后面的字母代表一个区域;我已经可以使用正则表达式

找到它
regex = re.compile(r"[^[0-9]+$")
reg_list = []
for i in list_one:
    reg_list.append(regex.findall(i))

哪个会给出

reg_list = [u'a', u'ba', u'ba', u'ca']

我想搜索list_two以检查其任何项目是否与我的reg_list中的任何内容匹配,如果是,则将其从该列表中删除。 我最终会以

结束
list_two = ['qqq55de']

因为'de'是不在list_one中的唯一位置。我目前的代码是

for i in list_one:
    for j in list_two:
        find_location = regex.findall(j)
        if a == find_location:
            list_two.pop(j)

但是我收到了错误

TypeError: expected string or buffer

有没有更好的方法来执行此操作?

3 个答案:

答案 0 :(得分:3)

假设您已经拥有reg_list,现在可以使用filter

filter(lambda x: re.findall(regex, x)[0] not in reg_list, list_two)

当它变得不可读时,我不喜欢把所有东西都包括在内。只考虑最可读(当然也是最有效)的解决方案。

答案 1 :(得分:1)

您可以将列表理解用作更简洁,更简洁的替代方案:

import re
list_one = ['aaa1a', 'bbb21ba', 'ccc4ba', 'qqq55ca']
list_two = ['eee21a', 'sws21ba', 'pop4ba', 'qqq55de']
new_list_two = [i for i in list_two if any(re.sub('[a-zA-Z]+$', '', i) == re.sub('[a-zA-Z]+$', '', b) for b in list_one)]

输出:

['qqq55de']

答案 2 :(得分:0)

迭代时无法修改列表。但是你可以创建一个新的

import re

list_one = ['aaa1a', 'bbb21ba', 'ccc4ba', 'qqq55ca']
list_two = ['eee21a', 'sws21ba', 'pop4ba', 'qqq55de']

regex = re.compile(r"[^0-9]+$")
reg_list = []
for i in list_one:
    reg_list.append(regex.findall(i)[0])

list_two = [j for j in list_two if regex.findall(j)[0] not in reg_list]

print(list_two)

结果:

['qqq55de']