【问题标题】:'SuperList' Object not deleting elements when a regex is present存在正则表达式时,“SuperList”对象不删除元素
【发布时间】:2021-03-31 16:00:23
【问题描述】:

我正在尝试创建一个“SuperList”类,它是一个带有 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”]。如何修复我的代码?

【问题讨论】:

    标签: python python-3.x regex python-re


    【解决方案1】:

    此模式[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的代码的最后一部分采用相同的方法

    【讨论】:

      猜你喜欢
      • 2012-07-05
      • 2013-08-14
      • 2013-02-08
      • 1970-01-01
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      相关资源
      最近更新 更多