Skip to main content
 首页 » 编程设计

python之替换多行字符串中除空格和\r\n 之外的每个字符,如何替换

2025年05月04日18lexus

多行字符串,例如

abc 123 
456 def 

想要的结果(序号 + 2):

cde 345 
678 fgh 

如果我使用:

text = "abc 123\n456 def" 
add2=''.join(chr(ord(c)+2) for c in text) 
print text 
print add2 

空格和\r\n也会被替换,请问如何在第2行代码中添加不包含space、\r或\n的异常

附注这是这个 question 的跟进。

请您参考如下方法:

您的另一个问题表明您可能正在翻译一个很长的字符串(一个 PDF 文件)。在这种情况下,使用字符串 translate 方法比在字符串上逐个字符进行 for 循环更快:

测试.py:

import string 
 
infile='filename.pdf' 
outfile='newfile.pdf' 
 
with open(infile,'r') as f: 
    text=f.read() 
 
def using_translate(): 
    start_chars=''.join(chr(n) for n  in range(256) if not chr(n).isspace()) 
    end_chars=''.join(chr((ord(c)+2)%256) for c in start_chars) 
    table = string.maketrans(start_chars,end_chars) 
    return text.translate(table) 
 
def using_for_c_in_text(): 
    return ''.join(chr((ord(c) + 2)%256) if not c.isspace() else c for c in text) 

这显示了使用 1M pdf 文件运行 timeit 的结果:

# % python -mtimeit -s"import test" "test.using_for_c_in_text()" 
# 10 loops, best of 3: 821 msec per loop 
# % python -mtimeit -s"import test" "test.using_translate()" 
# 100 loops, best of 3: 4.36 msec per loop 

PS:许多答案(包括我的一个答案)都使用了 chr(ord(c) + 2)。如果 ord(c)+2>=256,这将引发 TypeError。为避免 TypeError,您可以使用 chr((ord(c) + 2)%256)。