'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
的代码的最后部分采用相同的方法
我正在尝试创建一个 '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