Regex 使用re.sub清除嵌套列表
我有一组嵌套列表(不超过三层)需要清理。类似的例子如下:Regex 使用re.sub清除嵌套列表,regex,python-3.x,list,Regex,Python 3.x,List,我有一组嵌套列表(不超过三层)需要清理。类似的例子如下: test = [['qte%#', 'EKO*^'], ['eoim&', ['35ni%', 'mmie']]] 我希望运行以下程序: re.sub(r'[^a-zA-Z\d\[\] ], '', test) 我知道这里的问题是,我需要迭代嵌套列表,但在这样做时,我很难保持结构。也许还有一种更简单的方法来解决这个问题。我尝试过这方面的变化: for a in test: for b in a: if
test = [['qte%#', 'EKO*^'], ['eoim&', ['35ni%', 'mmie']]]
我希望运行以下程序:
re.sub(r'[^a-zA-Z\d\[\] ], '', test)
我知道这里的问题是,我需要迭代嵌套列表,但在这样做时,我很难保持结构。也许还有一种更简单的方法来解决这个问题。我尝试过这方面的变化:
for a in test:
for b in a:
if isinstance(b, list):
for c in b:
c = re.sub(r'[^a-zA-Z\d\[\] ]', ' ', c)
clean.append(c)
else:
print(b)
b = re.sub(r'[^a-zA-Z\d\[\] ]', ' ', b)
clean.append(b)
因为您只需要将所有嵌套列表编译成单个扁平列表,所以您可以在列表上使用,并对它们执行正则表达式
def flatten(lst):
flat = []
for x in lst:
if hasattr(x, '__iter__') and not isinstance(x, basestring):
flat.extend(flatten(x))
else:
flat.append(x)
return flat
clean = []
for c in flatten(test):
clean.append(re.sub(r'[^a-zA-Z\d\[\] ]', ' ', c))
此脚本将保持列表的结构不变-仅应用
re.sub
函数:
test = [['qte%#', 'EKO*^'], ['eoim&', ['35ni%', 'mmie']]]
import re
def clean(lst):
if not isinstance(lst, list):
return re.sub(r'[^a-zA-Z\d\[\] ]', '', lst)
return [clean(v) for v in lst]
print( clean(test) )
印刷品:
[['qte', 'EKO'], ['eoim', ['35ni', 'mmie']]]
非常感谢,非常适合我想做的事情。