Skip to main content
 首页 » 编程设计

python之正则表达式在 Python 中不匹配\t\n\r\f\v

2024年08月26日29三少

我有一个字符串列表:

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