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

时间:2010-04-28 03:48:47

标签: python string

多行字符串,例如

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也将被替换,如何在第二行代码中添加不包括space\r\n的例外。

P.S。它跟进了question

4 个答案:

答案 0 :(得分:3)

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

test.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)

答案 1 :(得分:2)

您只需检查字符是否为字母数字,否则保留原始字符:

add2 = ''.join(chr(ord(c)+2) if c.isalnum() else c for c in text)

请注意,将此应用于某些字符(例如“y”,“z”,“9”,“0”等)可能无法满足您的期望。即,'y'不会变成'a',而是'{'。

答案 2 :(得分:2)

比@ Roger的解决方案慢,但过滤所有空格:

>>> text = "abc 123\n456 def"
>>> ''.join(chr(ord(c) + 2) if not c.isspace() else c for c in text)
'cde 345\n678 fgh'

与上述相同,但只会破坏字母数字:

>>> text = "abc 123\n456 def"
>>> ''.join(chr(ord(c) + 2) if c.isalnum() else c for c in text)
'cde 345\n678 fgh'

答案 3 :(得分:1)

add2 = ''.join(chr(ord(c) + 2) if c not in "\n\r " else c for c in text)