2016-09-16 2 views
5

ich den Text zwischen einer Zahl und einem Emoticon in einem TextSpiel Unicode Emojis in Python Regex

Beispiel Texte extrahieren müssen:

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

Ausgang:

extract1 
extract2 

Der regex Code dass ich schrieb, extrahiert den Text zwischen 2 Zahlen, ich muss den Teil ändern, wo er die Unicode-Emoji-Zeichen identifiziert und Text zwischen ihnen extrahiert.

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

Bitte einen Python freundliche Methode vorschlagen, und ich brauche es mit allen Emoji an der Arbeit nicht nur die die in dem

Beispiel gegeben

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

+0

Sie sollten diesen Stapel Besuche die Regex für Emoticons bekommen http://stackoverflow.com/q/28077049/4639336 – reticentroot

+0

@reticentroot ich es nicht denken, arbeiten für utf8 Emoticons wie "". – Delgan

+0

@reticentroot Ich brauche es mit Unicode-Emoticons zu arbeiten. – LeDerp

Antwort

2

Da es eine Menge von Emojis with different unicode values ist, müssen Sie sie explizit in Ihrem regulären Ausdruck angeben, oder wenn sie mit einem spesific Bereich Sie können eine Zeichenklasse verwenden. In diesem Fall wird Ihre zweite simbol ist kein Standard Emojis, es ist nur ein Unicode-Zeichen, aber da es größer ist als \u263a (die Unicode-Darstellung ☺️) Sie es in einem Bereich mit \u263a setzen können:

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 wenn Sie mehr emojies passen möchten, können Sie einen Zeichenbereich verwenden (hier eine gute Referenz, die Sie den richtigen Bereich für verschiedene emojies zeigt 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 '] 

Beachten Sie, dass in der zweiten Fall müssen Sie sicherstellen, dass alle Die Zeichen mit dem oben genannten Bereich sind Emojies, die Sie möchten.

Hier ist ein weiteres Beispiel:

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

Ich brauche es mit allen Emojis zu arbeiten, nicht nur mit den im Beispiel angegebenen – LeDerp

+0

@LeDerp Wie gesagt, in diesem Fall müssen Sie einen Zeichenbereich verwenden. – Kasramvd

0

So kann dies oder arbeitet nicht abhängig von Ihrer braucht. Wenn Sie wissen, dass die Emoji vor der Zeit sind, obwohl dies wahrscheinlich funktioniert, brauchen Sie nur eine Liste der Arten von Emoticons zu erwarten.

Wie auch immer, ohne weitere Informationen würde ich das tun.

#!/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

Ich brauche es, um mit allen Emojis zu arbeiten, nicht nur die im Beispiel – LeDerp

+0

Dann wirst du eine Arbeitsliste brauchen, das Muster für jedes Emoji ist anders, es ist wie das Sprichwort ich muss jedes Wort in Englisch und Ich brauche eine einzige Regex, um das zu tun. Ansonsten denke an ein anderes Muster, vielleicht weißt du, dass es immer ein einzelnes Wort nach der Zahl ist, dann kannst du sagen, dass du das nächste Wort nach der Zahl bekommst und sich nicht um das Emoji kümmerst. – reticentroot

1

Hier ist mein Stich bei der Lösung. Nicht sicher, ob es unter allen Umständen funktioniert. Der Trick besteht darin, alle Unicode-Emojis in normalen Text umzuwandeln. Dies könnte getan werden, indem Sie this post folgen Dann können Sie die Emoji wie jeder normale Text anpassen. Beachten Sie, dass es nicht funktioniert, wenn der Literal Strings \u oder \U in Ihrem gesuchten Text ist.

Beispiel: Kopieren Sie Ihre Zeichenfolge in eine Datei, nennen wir es emo. Im Terminal:

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 '] 

Wo stackoverflow.py Datei ist:

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