Мне нужно заменить все не-ASCII (\ x00- \ x7F) символы пробелом. Я удивлен, что это не так просто в Python, если я что-то упустил. Следующая функция просто удаляет все не-ASCII символы:
def remove_non_ascii_1(text):
return ''.join(i for i in text if ord(i)<128)
И этот заменяет не-ASCII символы количеством пробелов согласно количеству байтов в кодовой точке символа (т.е. –
символ заменяется 3 пробелами):
def remove_non_ascii_2(text):
return re.sub(r'[^\x00-\x7F]',' ', text)
Как заменить все символы, не входящие в ASCII, одним пробелом?
Из за несметного из подобных SO вопросов , ни один адрес символов замены в противоположность к зачистки , и дополнительно обратиться ко всем не-ASCII символы не конкретный характер.
–
. Это этот парень .Ответы:
Ваше
''.join()
выражение фильтрует , удаляет все, что не является ASCII; вместо этого вы можете использовать условное выражение:Это обрабатывает символы один за другим и все равно будет использовать один пробел на замененный символ.
Ваше регулярное выражение должно просто заменить последовательные символы, не входящие в ASCII, пробелом:
Обратите внимание на
+
там.источник
str.join()
нужен список (он дважды передаст значения), и выражение генератора сначала будет преобразовано в единицу. Дать ему понимание списка просто быстрее. Смотрите этот пост .–
символ заменяется на 3 пробела» в вопросе подразумевает, что входные данные являются строкой байтов (не Unicode) и, следовательно, используется Python 2 (в противном случае''.join
произойдет сбой). Если OP хочет один пробел на кодовую точку Unicode, то вход должен быть сначала декодирован в Unicode.Чтобы вы получили наиболее похожее представление вашей исходной строки, я рекомендую модуль unidecode :
Тогда вы можете использовать его в строке:
источник
דותן
. Тем не менее, в общем смысле это здорово, спасибо!Для символьной обработки, использовать строки Unicode:
Но учтите, что у вас все еще будет проблема, если ваша строка содержит разложенные символы Unicode (например, отдельный символ и комбинацию знаков ударения):
источник
ud.normalize('NFC',s)
для объединения меток, но не все комбинированные комбинации представлены отдельными кодовыми точками. Вам нужно более разумное решение, глядя наud.category()
персонажа.\X
(расширенный кластер графем) regex (поддерживаетсяregex
модулем) позволяет выполнять итерации по таким символам (примечание: «графемы не обязательно объединяют последовательности символов, а объединение последовательностей символов не обязательно является графемами» ).Если символ замены может быть '?' вместо пробела я бы предложил
result = text.encode('ascii', 'replace').decode()
:Полученные результаты:
источник
Что насчет этого?
источник
В качестве нативного и эффективного подхода вам не нужно использовать
ord
какой-либо цикл над символами. Просто закодируйте сascii
и игнорируйте ошибки.Следующее просто удалит не-ascii символы:
Теперь, если вы хотите заменить удаленные символы, просто сделайте следующее:
источник
encode
возвратит строку байтов, так что имейте это в виду. Кроме того, этот метод не удаляет такие символы, как символ новой строки.Возможно, для другого вопроса, но я предоставляю свою версию ответа @ Alvero (используя unidecode). Я хочу сделать "обычную" полосу для моих строк, то есть начало и конец моей строки для пробельных символов, а затем заменить только другие пробельные символы на "обычный" пробел, т.е.
в
,
Сначала мы заменим все не-юникодные пробелы обычным пробелом (и снова включим его),
И затем мы разделяем это снова, с нормальным разделением Python, и удаляем каждый "бит",
И, наконец, присоединиться к ним снова, но только если строка проходит
if
тест,И с этим
safely_stripped('ㅤㅤㅤㅤCeñíaㅤmañanaㅤㅤㅤㅤ')
правильно возвращается'Ceñía mañana'
.источник