2015-11-18 3 views
0

Я пытаюсь удалить знаки препинания из строки в Юникоде, которая может содержать буквы, отличные от ascii. Я попытался с помощью regex модуля:Снимать специальные символы и знаки препинания из строки юникода

import regex 
text = u"<Üäik>" 
regex.sub(ur"\p{P}+", "", text) 

Однако, я заметил, что персонажи < и > не удаляются. Кто-нибудь знает, почему и есть ли другой способ преградить пунктуацию из строк Unicode?

EDIT: Еще один подход, который я опробовал делает:

import string 
text = text.encode("utf8").translate(None, string.punctuation).decode("utf8") 

, но я хотел бы избежать преобразования текста из Юникода в строку и обратно.

+1

Вы должны определить, что пунктуация. Особенно в юникоде это может быть очень много символов и комбинаций символов в зависимости от вашего языка. –

+1

Вам не нужно конвертировать в UTF-8 с высоким значением, чтобы использовать 'unicode.translate()'. Используйте 'text.translate (dict.fromkeys (ord (c) для c в string.punctuation))'. –

+0

И '\ p {P}' не включает '<' as '>'; они не классифицируются как знаки препинания. Они являются [Math Symbol (Sm)] (https://codepoints.net/search?gc=Sm) chodepoints. –

ответ

2

< и > классифицируются как Math Symbols (Sm), не пунктуация (P). Вы можете соответствовать либо:

regex.sub('[\p{P}\p{Sm}]+', '', text) 

Метод unicode.translate() тоже существует и занимает словарю отображение целых чисел (кодовых) либо к другим целочисленных кодовых, Юникода характера или None; None удаляет этот код. Карта string.punctuation в ord() с кодовыми точками:

text.translate(dict.fromkeys(ord(c) for c in string.punctuation)) 

Это только удаляет только ограниченное количество ASCII символов пунктуации.

Демо:

>>> import regex 
>>> text = u"<Üäik>" 
>>> print regex.sub('[\p{P}\p{Sm}]+', '', text) 
Üäik 
>>> import string 
>>> print text.translate(dict.fromkeys(ord(c) for c in string.punctuation)) 
Üäik 
+0

Я получаю сообщение об ошибке '_regex_core.error: неизвестное свойство в позиции 12' при запуске' regex.sub ('[\ p {P} \ p {Ms}] +', '', text) ' – SIslam

+0

@SIslam: my ошибка, я получил аббревиатуру для класса неправильно. С тех пор я исправил это в своем ответе. –

1

Попробуйте string модуль

import string,re 
text = u"<Üäik>" 
out = re.sub('[%s]' % re.escape(string.punctuation), '', text) 
print out 
print type(out) 

Prints-

Üäik 
<type 'unicode'> 
0

\p{P} соответствует знаки препинания.

Эти знаки пунктуации являются

! ' # S % & ' () * + , - ./: ; <=> ? @ [/]^_ { | } ~ 

< и > не знаки препинания. Поэтому они не будут удалены.

Попробуйте вместо

re.sub('[\p{L}<>]+',"",text) 
Смежные вопросы