2016-09-16 28 views
5

muszę wyodrębnić tekst między liczbą i emotikon w tekścieMecz unicode emotikonów w python regex

przykład tekst:

blah xzuyguhbc ibcbb bqw 2 extract1 ☺️ jbjhcb 6 extract2 bjvcvvv 

wyjściowa:

extract1 
extract2 

kodzie regex to, co napisałem, wyodrębnia tekst między dwoma liczbami, muszę zmienić część, w której identyfikuje znaki emoji w unicode i wyodrębnia tekst między nimi.

(?<=[\s][\d])(.*?)(?=[\d]) 

Proszę zaproponować pytona przyjazny sposób, a ja potrzebuję go do pracy ze wszystkimi emotikonom nie tylko z jednej, podane w przykładzie

https://regex101.com/r/uT1fM0/1

+0

Należy sprawdzić ten stos, aby uzyskać regex emotikonów http://stackoverflow.com/q/28077049/4639336 – reticentroot

+0

@reticentroot Nie sądzę, to będzie działać dla emotikonów utf8 takich jak "". – Delgan

+0

@reticentroot Potrzebuję go do pracy z emotikonami Unicode. – LeDerp

Odpowiedz

2

Ponieważ istnieje wiele emotikonom with different unicode values, trzeba wyraźnie określić je w regex, czy są one z szeregu Spesific możesz użyć klasy postaci. W tym przypadku, gdy drugi simbol nie jest standardowym emotikonów, to tylko znak Unicode, ale ponieważ jest większa niż \u263a (The reprezentacji Unicode ☺️) można umieścić go w szeregu z \u263a:

In [71]: s = 'blah xzuyguhbc ibcbb bqw 2 extract1 ☺️ jbjhcb 6 extract2 bjvcvvv' 

In [72]: regex = re.compile(r'\d+(.*?)(?:\u263a|\U0001f645)') 

In [74]: regex.findall(s) 
Out[74]: [' extract1 ', ' extract2 '] 

Or jeśli chcesz dopasować więcej emojies można użyć zakresu znaków (tutaj jest dobrym odniesienia, który pokazuje prawidłowego zakresu dla różnych emojies http://apps.timwhitlock.info/emoji/tables/unicode):

In [75]: regex = re.compile(r'\d+(.*?)[\u263a-\U0001f645]') 

In [76]: regex.findall(s) 
Out[76]: [' extract1 ', ' extract2 '] 

pamiętać, że w drugim przypadku trzeba się upewnić, że wszystko Postacie o wspomnianym zakresie to emisje, które chcesz.

Oto kolejny przykład:

In [77]: s = "blah 4 xzuyguhbc ibcbb bqw 2 extract1 ☺️ jbjhcb 6 extract2 bjvcvvv" 

In [78]: regex = re.compile(r'\d+(.*?)[\u263a-\U0001f645]') 

In [79]: regex.findall(s) 
Out[79]: [' xzuyguhbc ', ' extract1 ', ' extract2 '] 
+0

Potrzebuję go do pracy z wszystkimi emoji, nie tylko tymi podanymi w przykładzie. – LeDerp

+0

@LeDerp Jak wspomniałem, w takim przypadku musisz użyć zakresu znaków. – Kasramvd

0

Więc to może być lub nie działać w zależności od Państwa wymagania. Jeśli wiesz, że emoji jest przed czasem, ale prawdopodobnie to zadziała, potrzebujesz tylko listy typów emotikonów, których możesz oczekiwać.

W każdym razie bez dodatkowych informacji, to właśnie bym zrobił.

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import re 

my_regex = re.compile(r'\d\s*([^☺️|^]+)') 

string = "blah xzuyguhbc ibcbb bqw 2 extract1 ☺️ jbjhcb 6 extract2 bjvcvvv" 

m = my_regex.findall(string) 
if m: 
    print m 
+0

Potrzebuję go do pracy z wszystkimi emoji, nie tylko tymi podanymi w przykładzie – LeDerp

+0

Potem będziesz potrzebował listy roboczej, wzór dla każdego emoji jest inny, to tak, jakbym powiedział, że muszę dopasować każde słowo w języku angielskim i Potrzebuję jednego regex, aby to zrobić. W przeciwnym razie pomyśl o innym schemacie, być może wiesz, że zawsze jest to jedno słowo po numerze, wtedy możesz powiedzieć, że dostajesz kolejne słowo po numerze i nie dbasz o emoji. – reticentroot

1

Oto moje ukłucie w rozwiązanie. Nie jestem pewien, czy zadziała w każdych okolicznościach. Sztuką jest przekonwertowanie wszystkich emoji Unicode na zwykły tekst. Można to zrobić, postępując zgodnie z this post Następnie można dopasować emoji tak jak zwykły tekst. Zauważ, że nie zadziała, jeśli w wyszukiwanym tekście znajdują się ciągi znaków lub \U.

Przykład: skopiuj ciąg znaków do pliku, nazwijmy go emo. W terminalu:

Chip [email protected] 03:24:[email protected] ~: cat emo | python stackoverflow.py 
blah xzuyguhbc ibcbb bqw 2 extract1 \u263a\ufe0f jbjhcb 6 extract2 \U0001f645 bjvcvvv\n 
------------------------ 
[' extract1 ', ' extract2 '] 

Gdzie stackoverflow.py plik jest:

import fileinput 
a = fileinput.input(); 
for line in a: 
    teststring = unicode(line,'utf-8') 
    teststring = teststring.encode('unicode-escape') 

import re 
print teststring 
print "------------------------" 
m = re.findall('(?<=[\s][\d])(.*?)(?=\\\\[uU])', teststring) 
print m