我有一个字符串列表:
content = ['***************************************\n\t', 'ADVENTURE', '*', 'Solving', 'it', 'in', 'easy', 'steps', '*\n\t', '*\t\t\t\t', '*\n\t', '*\t\t\t\t', '*\n\t', '***************************************\n\t\t', 'FROM:', 'THE', 'ROM', 'DR.', 'CALL', 'HER']
我试图删除以非字母数字字符结尾的任何内容,例如\t\n\v 等等。
我有以下代码:
import re
for each in content:
m = re.match('.*[\t\n\r\f\v]+',each)
if m:
content.remove(each)
但输出仍然给我带\n 或\t 的字符串。有什么想法吗?
请您参考如下方法:
此行为的原因是 content 列表正在动态更新。这会产生以下问题。假设它选择第 8 个索引项,即 '*\n\t',它匹配正则表达式并被删除,这使得 '*\t\t\t\t' 变为向后移动一个位置,选择的下一个项目是 '*\n\t'。因此 '*\t\t\t\t' 保留在 中内容列表。为避免这种情况,您需要使用 copy 模块作为:
>>> import copy
>>> content = ['***************************************\n\t', 'ADVENTURE', '*', 'Solving', 'it', 'in', 'easy', 'steps', '*\n\t', '*\t\t\t\t', '*\n\t', '*\t\t\t\t', '*\n\t', '***************************************\n\t\t', 'FROM:', 'THE', 'ROM', 'DR.', 'CALL', 'HER']
>>> for i in copy.copy(content):
... m=re.match(r'.*[\t\n\r\f\v]+',i)
... if m:
... content.remove(i)
...
>>> content
['ADVENTURE', '*', 'Solving', 'it', 'in', 'easy', 'steps', 'FROM:', 'THE', 'ROM', 'DR.', 'CALL', 'HER']
你也可以在不使用 copy 模块的情况下这样做:
>>> for i in content[:]:
... m=re.match(r'.*[\t\n\r\f\v]+',i)
... if m:
... content.remove(i)
...
>>> content
['ADVENTURE', '*', 'Solving', 'it', 'in', 'easy', 'steps', 'FROM:', 'THE', 'ROM', 'DR.', 'CALL', 'HER']
