Удалить специальные символы, но не буквы с акцентом - PullRequest
3 голосов
/ 23 мая 2019

Я делаю следующее:

re.sub(r'[^ \nA-Za-z0-9/]+', '', document)

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

Итак, я хочу удалить все специальные символы, кроме новой строки и косой черты.

Однако я не хочу удалять акцентированные буквы, которые есть на разных языках, например на французском, немецком и т. Д.

Но если я введу приведенный выше код, то, например, слово

Motörhead

становится

Motrhead

и я не хочу этого делать.

Так как мне запустить приведенный выше код, но без удаления акцентированных букв?

UPDATE:

@ MattM ниже предлагает решение, которое работает для таких языков, как английский, французский, немецкий и т. Д., Но, безусловно, не работает для таких языков, как польский, где все акцентированные буквы все еще были удалены.

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

Я почти уверен, что это сделает то, что вам нужно

x = re.sub(r'[^ \nA-Za-z0-9À-ÖØ-öø-ÿ/]+', '', 'Motörhead')

Также проверьте здесь для обсуждения о регулярном выражении javascript, которое имеет некоторую соответствующую информацию, несмотря на любые различия


РЕДАКТИРОВАТЬ -

Чтобы расширить новую заботу Поэта Модита - да, вы можете включить нелатинские символы. Однако это может стать слишком громоздким. Если вы посмотрите на список символов Unicode , я включил диапазоны акцентированных латинских символов. Так что, если вы хотите включить все символы кириллицы, мы добавим Ѐ-ӿ к регулярному выражению.

import re

yourString = 'Cyrillic Char Ѥ'
yourString = re.sub(r'[^ \nA-Za-z0-9À-ÖØ-öø-ÿЀ-ӿ/]+', '', yourString)
text_file = open("Output.txt", "wb")
text_file.write(yourString.encode('utf8'))
text_file.close()

Однако при использовании этого метода вам, возможно, придется включить много диапазонов, в зависимости от того, какие символы из каких языков вы хотите или не хотите.

0 голосов
/ 23 мая 2019

Вы также можете повозиться с кодировкой символов.Я не знаю, используете ли вы utf-8.У меня как-то был файл python в utf8 (я использую Windows и YMMV), но

#coding: iso-8859-1
import re

x = "Mötörhead MÖTÖRHEAD"

y = re.sub(r'[^\xe0-\xff]', '', x)
print(y, "only keeps accented lower-case characters from", x)
z = re.sub(r'[^\xc0-\xff]', '', x)
print(z, "keeps all accented characters from", x)

Важна первая закомментированная строка.Без этого python выдает ошибку кодирования для меня.

Вы можете использовать Windows Charmap (западный набор символов Windows), если вы хотите настроить шестнадцатеричные значения символов, которые вы конкретно хотите.xc0 - начало заглавных букв с заглавными буквами.Но код Мэтта М более читабелен, если вы хотите использовать только определенные символы или гласные.Шахта срезает углы, поскольку она также закрывает знак деления (0xf7) и умножения (0xd7).

...