2017-03-31 15 views
22
Bütün emoji'yi a_list içinde yeni listede ayıklamak nasıl

Tüm emojileri metinlerden nasıl çıkarırsınız?

a_list = [' me así, bla es se ds '] 

aşağıdaki listeyi göz önünde bulundurun ben normal ifadeler kullanabilirsiniz çalıştı

new_lis = ['  '] 

ama tüm olası yok emojis kodlamaları.

+0

http://stackoverflow.com/q/26568722/674039 ve http://stackoverflow.com/q/35404144/674039 – wim

cevap

29

emoji kitaplığını kullanabilirsiniz. Tek bir kod noktasının, emoji.UNICODE_EMOJI'da olup olmadığını kontrol ederek bir emoji kod noktası olup olmadığını kontrol edebilirsiniz.

import emoji 

def extract_emojis(str): 
    return ''.join(c for c in str if c in emoji.UNICODE_EMOJI) 
+0

Özel karşılaştırıcı için emoji listesini ** # EmojiCodeSheet ** [burada] (https://github.com/shanraisshan/EmojiCodeSheet) içinde bulunan dize/int biçiminde indirebilirsiniz. – shanraisshan

-2

Tüm Unicode emojileri kendi kod noktaları ile birlikte here'dur. Bunlar 1F600 ila 1F64F'dir, böylece hepsini bir aralık benzeri yineleyici ile oluşturabilirsiniz.

+1

Yani emoji'leri yalnızca belirli bir aralık var. Daha fazlası var. – user2357112

3

Eğer emojies bulmak için sadece uygun bir regex ile düzenli ifadeleri ve re.findall() kullanabilirsiniz pythonic yolu olarak, harici bir kütüphaneyi kullanmak istemiyorsanız:

In [74]: import re 
In [75]: re.findall(r'[^\w\s,]', a_list[0]) 
Out[75]: ['', '', '', '', '', ''] 

düzenli ifade r'[^\w\s,]', bir kelime karakteri, boşluk veya virgül olmayan herhangi bir karakterle eşleşen negatif karakter sınıfıdır.

Yorumda belirttiğim gibi, bir metin genellikle bu yaklaşımla kolayca ele alınacak sözcük karakterleri ve noktalama işaretleri içeriyor, diğer durumlar için bunları yalnızca karakter sınıfına manuel olarak ekleyebilirsiniz. Karakter sınıfında bir dizi karakter belirleyebileceğiniz için, daha kısa ve daha esnek hale getirebileceğinizi unutmayın.

Başka bir çözüm yerine olmayan emojisi karakter emojies kabul eden bir karakter sınıfını (^ olmadan []) kullanımı hariç bir negatif karakter sınıfıdır. Çok sayıda emojiyi with different unicode values olduğu için, aralıkları karakter sınıfına eklemeniz yeterlidir. Burada daha fazla emojiyi eşleştirmek istiyorsanız, iyi bir referans, farklı emojilerle ilgili tüm standart emojileri içerir http://apps.timwhitlock.info/emoji/tables/unicode:

+0

Bu özel girdi için çalışıyor, ancak '\ w',' \ s' veya virgül kategorilerine girmeyen çok sayıda emoji içermeyen karakter var. – user2357112

+0

@ user2357112 Bir metin, genellikle bu yaklaşımla kolayca ele alınacak sözcük karakterleri ve noktalama işaretleri içerir, diğer durumlar için bunları yalnızca karakter sınıfına manuel olarak ekleyebilirsiniz .. Karakter sınıfında bir karakter aralığı belirtebileceğinizi unutmayın. Daha kısa ve daha esnek hale getirebilirsiniz. – Kasramvd

+1

Normal ifadeniz, diğer şeylerin yanı sıra virgül olmayan tüm noktalama işaretlerinde başarısız olur. – user2357112

1

En yüksek puanlı cevap her zaman işe yaramaz. Örneğin, bayrak emojisi bulunmayacaktır. dizeyi göz önünde bulundurun: daha iyi çalışmasını hangi

s = u'Hello \U0001f1f7\U0001f1fa hello' 

import emoji 
emojis_list = map(lambda x: ''.join(x.split()), emoji.UNICODE_EMOJI.keys()) 
r = re.compile('|'.join(re.escape(p) for p in emojis_list)) 
print(' '.join(r.findall(s))) 
0

tam çalı sormak olsun çözüm, en üst düzey cevap ve user594836 cevabı arasında bir karışımıdır. Bu benim için Python 3.6'da çalışan kod. içinde Bağlama

import emoji 
import re 

a_list=[' me así,bla es,se ds '] 

## Create the function to extract the emojis 
def extract_emojis(str): 
    emojis_list = map(lambda x: ''.join(x.split()), emoji.UNICODE_EMOJI.keys()) 
    r = re.compile('|'.join(re.escape(p) for p in emojis_list)) 
    aux=[' '.join(r.findall(s)) for s in a_list] 
    return(aux) 

## Execute the function 
extract_emojis(s) 

## the output 
['  '] 
İlgili konular