【问题标题】:Using re.sub to clean nested lists使用 re.sub 清理嵌套列表
【发布时间】:2019-08-22 20:22:16
【问题描述】:

我有一组需要清理的嵌套列表(深度不超过三个)。一个类似的例子是这样的:

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)

【问题讨论】:

    标签: regex python-3.x list


    【解决方案1】:

    此脚本将保持列表结构不变 - 只需应用 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']]]
    

    【讨论】:

    • 非常感谢,非常适合我想做的事情。
    【解决方案2】:

    由于您只需要将所有嵌套列表编译成一个扁平化列表,您可以在列表中使用flatten function,并对它们执行正则表达式。

    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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 2018-01-06
      • 2011-12-24
      • 2011-04-07
      • 2018-03-18
      相关资源
      最近更新 更多