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']]]

非常感谢,非常适合我想做的事情。