2010-12-01 4 views

ответ

20

Вы можете использовать str.translate с соответствующей картой, например, как это:

>>> mpa = dict.fromkeys(range(32)) 
>>> 'abc\02de'.translate(mpa) 
'abcde' 
+5

Я бы предложил не использовать `map` в качестве имени переменной , – 2010-12-01 13:43:01

+3

Обратите внимание, однако, что это ядерные новеллы. – mlissner 2011-05-20 07:40:57

+4

Этот код не работает. Я продолжаю получать `TypeError: ожидается ошибка объекта символьного буфера. Python 2.6. – user1476056 2012-10-19 21:09:21

6

Ваша реализация неправильно, поскольку значение i неверно. Однако это не единственная проблема: она также многократно использует медленные операции с строкой, что означает, что она работает в O (n) вместо O (n). Попробуйте это вместо:

return ''.join(c for c in line if ord(c) >= 32) 
1

Вы изменяете линию во время итерации по ней. Что-то вроде ''.join([x for x in line if ord(x) >= 32])

5

И для Python 2, с встроено translate:

import string 
all_bytes = string.maketrans('', '') # String of 256 characters with (byte) value 0 to 255 

line.translate(all_bytes, all_bytes[:32]) # All bytes < 32 are deleted (the second argument lists the bytes to delete) 
79

Есть сотни из управляющих символов в Unicode. Если вы дезинфицируете данные из Интернета или какой-либо другой источник, который может содержать символы, отличные от ascii, вам понадобится unicodedata module Python. Функция unicodedata.category(…) возвращает unicode category code (например, управляющий символ, пробел, букву и т. Д.) Любого символа. Для управляющих символов категория всегда начинается с «C».

Этот фрагмент удаляет все управляющие символы из строки.

import unicodedata 
def remove_control_characters(s): 
    return "".join(ch for ch in s if unicodedata.category(ch)[0]!="C") 

Примеры unicode categories:

>>> from unicodedata import category 
>>> category('\r')  # carriage return --> Cc : control character 
'Cc' 
>>> category('\0')  # null character ---> Cc : control character 
'Cc' 
>>> category('\t')  # tab --------------> Cc : control character 
'Cc' 
>>> category(' ')  # space ------------> Zs : separator, space 
'Zs' 
>>> category(u'\u200A') # hair space -------> Zs : separator, space 
'Zs' 
>>> category(u'\u200b') # zero width space -> Cf : control character, formatting 
'Cf' 
>>> category('A')  # letter "A" -------> Lu : letter, uppercase 
'Lu' 
>>> category(u'\u4e21') # 両 ---------------> Lo : letter, other 
'Lo' 
>>> category(',')  # comma -----------> Po : punctuation 
'Po' 
>>> 
3

всех, кто заинтересован в регулярных выражений класса символов, который соответствует любому Unicode control character[\x00-\x1f\x7f-\x9f] может использовать.

Вы можете проверить это следующим образом:

>>> import unicodedata, re, sys 
>>> all_chars = [chr(i) for i in range(sys.maxunicode)] 
>>> control_chars = ''.join(c for c in all_chars if unicodedata.category(c) == 'Cc') 
>>> expanded_class = ''.join(c for c in all_chars if re.match(r'[\x00-\x1f\x7f-\x9f]', c)) 
>>> control_chars == expanded_class 
True 

Таким образом, чтобы удалить управляющие символы с помощью re просто используйте следующее:

>>> re.sub(r'[\x00-\x1f\x7f-\x9f]', '', 'abc\02de') 
'abcde' 
Смежные вопросы