2016-07-31 3 views
2

Я хочу заменить все emoji на '', но мой regEx не работает.
Например,python-re.sub() и unicode

content= u'?\u86cb\u767d12\U0001f633\uff0c\u4f53\u6e29\u65e9\u6668\u6b63\u5e38\uff0c\u5348\u540e\u665a\u95f4\u53d1\u70ed\uff0c\u6211\u73b0\u5728\u8be5\u548b\U0001f633?' 

, и я хочу, чтобы заменить все формы, как \U0001f633 с '' так я пишу код:

print re.sub(ur'\\U[0-9a-fA-F]{8}','',content)

Но это не работает.
Большое спасибо.

ответ

3

Вы не сможете распознать надлежащим образом декодированные коды кодировки unicode таким образом (как строки, содержащие \uXXXX и т. Д.). Правильно декодированные, к тому времени, когда парсер регулярных выражений попадает к ним, каждый символ *.

В зависимости от того, был ли ваш питон скомпилирован только с 16-битными юникода кодовых точек или нет, вы хотите что-то вроде рисунка либо:

# 16-bit codepoints 
re_strip = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]') 

# 32-bit* codepoints 
re_strip = re.compile(u'[\U00010000-\U0010FFFF]') 

И ваш код будет выглядеть следующим образом:

import re 

# Pick a pattern, adjust as necessary 
#re_strip = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]') 
re_strip = re.compile(u'[\U00010000-\U0010FFFF]') 

content= u'[\u86cb\u767d12\U0001f633\uff0c\u4f53\u6e29\u65e9\u6668\u6b63\u5e38\uff0c\u5348\u540e\u665a\u95f4\u53d1\u70ed\uff0c\u6211\u73b0\u5728\u8be5\u548b\U0001f633]' 
print(content) 

stripped = re_strip.sub('', content) 
print(stripped) 

Оба выражения, уменьшить количество символов в строке stripped до 26.

Этих выражений вырезать смайлики вы были после того, как, бу t может также вычеркнуть другие вещи, которые вы сделать хотите. Возможно, стоит просмотреть список диапазонов кодовых ссылок в формате unicode (например, here) и настроить их.

Вы можете определить, является ли ваш питон установить будет распознавать только 16-разрядные кодовые, делая что-то вроде:

import sys 
print(sys.maxunicode.bit_length()) 

Если это отображает 16, вам нужно первое выражение регулярных выражений. Если он отображает что-то большее, чем 16 (для меня это говорит 21), второй - это то, что вы хотите.

Ни одно выражение не будет работать при использовании на установке python с неправильным sys.maxunicode.

См. Также: this связанные.

+0

спасибо. Оно работает. Но вы говорите, что это может также лишить других вещей, которые я хочу. Так что, если я только хочу удалить эможи? Содержимое может содержать китайские символы, цифры, буквы, пунктуации и эможи. BTW, мой python скомпилирован только с 16-разрядными кодами Unicode. – sophiaCY

+0

Ну, это * может *. Кодовые страницы, которые я «фильтрую», начинаются с 10000 [здесь] (http://jrgraphix.net/research/unicode_blocks.php). Итак, что-нибудь в «Линейной B Syllabary» через «Теги». По моему опыту, большинство шрифтов даже не имеют глифов для этих кодовых страниц. Так что (очень) маловероятно, что все, что вы * * хотите, находится в этом диапазоне, поэтому фильтрация, вероятно, прекрасна, но это просто то, о чем нужно знать. – jedwards