2016-12-05 1 views
1

Ich verwendete this post, um eine Regex zu erstellen, die Emojis in einer Textzeichenfolge finden und einfach einige Leerzeichen auf jeder Seite anbringen würde. mein regex Code:Surround-Emoji mit Leerzeichen

try: 
    # Wide UCS-4 build 
    oRes = re.compile(u'[' 
     u'\U0001F300-\U0001F64F' 
     u'\U0001F680-\U0001F6FF' 
     u'\u2600-\u26FF\u2700-\u27BF]+', 
     re.UNICODE) 
except re.error: 
    # Narrow UCS-2 build 
    oRes = re.compile(u'(' 
     u'\ud83c[\udf00-\udfff]|' 
     u'\ud83d[\udc00-\ude4f\ude80-\udeff]|' 
     u'[\u2600-\u26FF\u2700-\u27BF])+', 
     re.UNICODE) 

s2 = oRE.sub(r' \1 ', s1) 

Aber ich bin immer ein paar wirklich seltsames Verhalten, wo Emojis entfernt werden, wie im Beispiel unten. Jeder Rat würde geschätzt werden. Ich benutze Python auf einem MacBook. Vielen Dank.

INPUT

هيلاري كلينتون "متنحة" وتشير إلى عملية غش في ولاية بانسيلفانيا العتيقة قائلة: "عند فرز الاصوات ..قطعوا الكهربا ✋" # ابو_الياس

OUTPUT

هيلاري "لينتون "متنحة" وتشير إلى عملية غشغشي ولاية بانسيلفانيا العتيقة قائلة: "عند زرز الاصصات ..ططعوا الكهربا ✋ "# ابو_الياس

+1

Welche Version von Python verwenden Sie? – timotree

+1

Danke für Ihre Antwort, ich benutze 2.7. –

+0

Gern geschehen. Ich weiß nicht viel über Unicode in Python obwohl so jemand anders Ihre Frage beantworten muss. – timotree

Antwort

1

Das Folgende funktioniert für mich, sobald ich die Platzierung der runden Klammern in Ihren regulären Ausdrücken korrigieren. Im Block try benötigen Sie runde Klammern um das Ganze, wenn Sie die Gruppe \1 überhaupt erstellen möchten; im except Block müssen die runden Klammern die + enthalten, sonst wird die \1 Gruppe nur das erste von mehreren relevanten Zeichen erfassen.

import re 
with open('input.txt', 'rb') as f: 
    s1 = f.read().decode('utf-8').strip() 

try: 
    # Wide UCS-4 build 
    oRes = re.compile(u'([' 
     u'\U0001F300-\U0001F64F' 
     u'\U0001F680-\U0001F6FF' 
     u'\u2600-\u26FF\u2700-\u27BF]+)', 
     re.UNICODE) 
except re.error: 
    # Narrow UCS-2 build 
    oRes = re.compile(u'((' 
     u'\ud83c[\udf00-\udfff]|' 
     u'\ud83d[\udc00-\ude4f\ude80-\udeff]|' 
     u'[\u2600-\u26FF\u2700-\u27BF])+)', 
     re.UNICODE) 

s2 = oRes.sub(r' \1 ', s1) 

with open('output.txt', 'wb') as f: 
    f.write((s1+'\n').encode('utf-8')) 
    f.write((s2+'\n').encode('utf-8')) 

Wie für die Umkehrung der Charaktere, das muss ein Artefakt von einem gewissen Schritt in Ihrer Eingabe/Ausgabe oder Kopieren/Einfügen Kette nicht korrekt von rechts nach links der Natur der arabischen Handhabung. Es passiert nicht für mich. Die Ergebnisse sehen gut aus, wenn ich in TextWrangler auf meinem MacBook output.txt öffne.

+0

Guter Fang. Ich habe übersehen, dass das '+' nicht im Capture war. – timotree

+0

Ich denke, das ist falsch in der Ausnahme Block. Beachten Sie, dass die Klammern OR-Anweisungen (|) enthalten, was bedeutet, dass Sie im aktuellen Code nur das Pluszeichen für den letzten ODER-Fall anwenden. – Meyer

+0

Hmm, @SMeyer hat Recht. Um * jeden * Emoji-Charakter mit Leerzeichen zu umgeben (wenn das das Ziel ist), muss das '+' entfernt werden. Um jede Emoji * -Sequenz * mit Leerzeichen zu umgeben, sind zusätzliche Klammern erforderlich. Ich setze die zusätzlichen ein, weil der "try" -Block darauf hinweist, dass die umgebenden ganzen Sequenzen das Ziel sind. – jez