Замените каждый символ в многострочной строке, кроме пробела и \ r \ n, как? - PullRequest
1 голос
/ 28 апреля 2010

Многострочная строка, например

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 во 2-й строке кода.

p.s. это ответ на этот вопрос .

Ответы [ 4 ]

3 голосов
/ 28 апреля 2010

Ваш другой вопрос предполагает, что вы можете переводить очень длинную строку (файл PDF). В этом случае использование метода string translate будет быстрее, чем посимвольный цикл for для строки:

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)

Здесь показаны результаты выполнения таймита с использованием файла PDF размером 1 МБ:

# % 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). Это выдает ошибку TypeError, если ord(c)+2>=256. Чтобы избежать ошибки TypeError, вы можете использовать chr((ord(c) + 2)%256).

2 голосов
/ 28 апреля 2010

медленнее, чем решение @ Roger's, но фильтрует все пробелы:

>>> 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'
2 голосов
/ 28 апреля 2010

Вы можете просто проверить, является ли символ буквенно-цифровым, и оставить исходный символ в противном случае:

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

Обратите внимание, что применение этого к некоторым символам (таким как 'y', 'z', '9', '0' и т. Д.) Может не дать того, что вы ожидаете. То есть «у» не станет «а», но «{».

1 голос
/ 28 апреля 2010
add2 = ''.join(chr(ord(c) + 2) if c not in "\n\r " else c for c in text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...