重新在清单清单中

时间:2019-01-17 14:41:31

标签: regex python-3.x

我有一个列表列表(子列表的长度不规则),我要在其上执行re操作,但无法使其正常工作。我确定我缺少亵渎的东西;有人可以指出我做错了什么吗?

请考虑以下代码段:

test_list = [ # sample list of lists in which I want to replace the "\n"
      ["test\n\n\n\n\n\n\n\n", "another test\n", "spam"],
      ["egg\n\n", "house"],
      ["\n\nabc", "def\n", "\n\n\nghi", "jklm\n\n", "nop(e)", "\nqrst\n"],
      ["uvw\n", "\n\nx", "yz\n\n"]]
for item in test_list:
    for subitem in item:
    re.sub('\n', '___', subitem)
pprint.pprint(test_list)

输出:

[['test\n\n\n\n\n\n\n\n', 'another test\n', 'spam'],
 ['egg\n\n', 'house'],
 ['\n\nabc', 'def\n', '\n\n\nghi', 'jklm\n\n', 'nop(e)', '\nqrst\n'],
 ['uvw\n', '\n\nx', 'yz\n\n']]

(输出未更改-替换无效。)

预先感谢您的帮助。

编辑:

感谢Wiktor Stribiżew的链接。所引用问题的第一个建议-字符串不可更改!-很有帮助,但我无法使其用于列表列表

遵循herehere的建议,我的代码如下:

newtestlist = [[re.sub("\n", '_', item) for subitem in item] for item in testlist]

但是,它不起作用(抛出TypeError: expected string or bytes-like object-我未正确引用列表中的子项。) 有人可以指出我正确的方向吗?非常感谢

1 个答案:

答案 0 :(得分:1)

对于一个简单的列表列表,您应该可以使用已编辑的解决方案,但是必须将re.sub("\n", '_', item)更改为re.sub("\n", '_', subitem),如@Mark Meyer所指出的那样。我也注意到了一个错字。 testlist,而不是test_list。这是我测试并与您的test_list

一起使用的
[[re.sub(r'\n', r'_', item) for item in sub_list] for sub_list in test_list]

但是如果您有一个深层嵌套的列表,我认为您将需要一个递归函数。

def sub_nested(l, regin, regout):
    """Recursive function to do string replace in a nested list"""
    retlist = []
    for item in l:
        if isinstance(item, list):
            retlist.append(sub_nested(item, regin, regout))
        else:
            retlist.append(re.sub(regin, regout, item))
    return retlist

在输入列表中对其进行测试。

sub_nested(test_list, r'\n', r'___')

Out: 
 [['test________________________', 'another test___', 'spam'],
 ['egg______', 'house'],
 ['______abc', 'def___', '_________ghi', 'jklm______', 'nop(e)', '___qrst___'],
 ['uvw___', '______x', 'yz______']]