'SuperList' 存在正则表达式时对象不删除元素

'SuperList' Object not deleting elements when a regex is present

我正在尝试创建一个 'SuperList' class,它是一个带有 del_all() 方法的列表。当我尝试使其与正则表达式一起使用时,del_all() 方法根本不会删除任何内容。

这是我当前的代码:

import re

class SuperList(list):

    def __init__(self, seq):
        list.__init__(self, seq)
        self.seq = list(seq)

    def del_all(self, item="", regex=None):
        if item not in self.seq:
            if not regex:
                raise ValueError("item not in list")
            else:
                for i in range(len(self.seq)):
                    if re.match(re.compile(regex), self.seq[i]):
                        self.seq.remove(self.seq[i])
        else:
            if not regex:
                while item in self.seq:
                    self.seq.remove(item)
            else:
                for i in range(len(self.seq)):
                    if re.match(regex, self.seq[i]):
                        self.seq.remove(self.seq[i])


super_list = SuperList(["A", "b", "f", "Y"])
super_list.del_all(regex=re.compile("[A-Z]]"))
print(super_list.seq)

这里的预期输出是 ["b", "f"]。但我得到的是 [“A”、“b”、“f”、“Y”]。我该如何修复我的代码?

此模式 [A-Z]] 将不匹配列表中的任何项目。它匹配大写字符 A-Z 后跟 ]

如果将模式更改为 [a-z] 以匹配小写字符,则代码有匹配项。

但是,在这部分代码中,您要删除列表中正在迭代的项目,这可能会给您带来错误:

IndexError: list index out of range

对于这部分代码

for i in range(len(self.seq)):
    if re.match(regex, self.seq[i]):
        self.seq.remove(self.seq[i])

您可能会做的不是取消设置索引,而是使用 for comprehension 过滤 seq;

self.seq = [x for x in self.seq if re.match(regex, x)]

输出

['b', 'f']

那么您也可以对使用 remove

的代码的最后部分采用相同的方法