Эта строка Python 3 содержит все виды специальных символов:
s = 'abcd\x65\x66 äüöë\xf1 \u00a0\u00a1\u00a2 漢字 \a\b\r\t\n\v\\ \231\x9a \u2640\u2642\uffff'
Если вы попытаетесь отобразить его в консоли (или используете repr
), он довольно хорошо справится с экранированием всех непечатаемых символов из этой строки:
>>> s
'abcdef äüöëñ \xa0¡¢ 漢字 \x07\x08\r\t\n\x0b\\ \x99\x9a ♀♂\uffff'
Он достаточно умен, чтобы распознать, например, горизонтальная вкладка (\t
) для печати, но вертикальная (\v
) для печати (отображается как \x0b
, а не \v
).
Любой другой непечатаемый символ также отображается как \xNN
или \uNNNN
в repr
. Поэтому мы можем использовать это в качестве теста:
def is_printable(s):
return not any(repr(ch).startswith("'\\x") or repr(ch).startswith("'\\u") for ch in s)
Там могут быть некоторые пограничные символы, например, неразрывный пробел (\xa0
) здесь рассматривается как непечатаемый. Может быть, и не должно быть, но эти специальные могут быть жестко закодированы.
приписка
Вы можете сделать это, чтобы извлечь из строки только печатаемые символы:
>>> ''.join(ch for ch in s if is_printable(ch))
'abcdef äüöëñ ¡¢ 漢字 \r\t\n\\ ♀♂'