我有一个列表列表(子列表的长度不规则),我要在其上执行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的链接。所引用问题的第一个建议-字符串不可更改!-很有帮助,但我无法使其用于列表列表。
newtestlist = [[re.sub("\n", '_', item) for subitem in item] for item in testlist]
但是,它不起作用(抛出TypeError: expected string or bytes-like object
-我未正确引用列表中的子项。)
有人可以指出我正确的方向吗?非常感谢
答案 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______']]