2017-10-29 1 views
2

Das Ziel besteht darin, ein Zeichen mit Leerzeichen zu füllen, wenn die issubset Bedingung erfüllt ist, z.Wie packt man ein Zeichen mit Leerzeichen, wenn es zwischen einem Unicode-Bereich liegt?

[in]:

subset = [chr(ordinal) for ordinal in range(ord(u'\u31c0'), ord(u'\u31ef'))] 

text = '这是个小㇈㇋伙子' 

[out]:

output_text = '这是个小 ㇈ ㇋ 伙子' 

ich es als solches tun könnte:

def issubset(uchar): 
    if u'\u31c0' <= uchar <= u'\u31ef': 
     return True 
    return False 

def pad_space_ifsubset(text): 
    output = "" 
    for ch in text: 
     if issubset(ch): 
      output += " " + ch + " " 
     else: 
      output += ch 
    return output 

text = '这是个小㇈㇋伙子' 

pad_space_ifsubset(text) 

Aber gibt es einen einfacheren Weg, dies zu tun? Vielleicht mit Regex?

+1

Was meinst du mit einfacheren Weg? effizienter, reduierbar? – scharette

+0

Entweder effizienter oder nur ein anderer Weg (mit Regex oder anders). – alvas

Antwort

2

Sie re.sub mit einer Reihe Mustern über die Codepunkte von Interesse verwenden, und eine Gruppe Rückreferenzierung im Ersetzungsstring (\g<0> werden die gesamte Teilkette abgestimmt, oder in diesem Fall ersetzen, ein einzelne Zeichen aus dem Bereich):

import re 

def pad_space_ifsubset(text): 
    return re.sub(u'[\u31c0-\u31ef]', ' \g<0> ', text) 

Zum Beispiel:

>>> text = u'这是个小㇈㇋伙子' 
>>> print pad_space_ifsubset(text) 
这是个小 ㇈ ㇋ 伙子 
+0

Sie brauchen keine einfangende Gruppe um das gesamte Muster herum, die durch die gesamte Übereinstimmung ersetzt werden soll: 're (u '[\ u31c0- \ u31ef]', '\ g <0>', Text)'. Sie benötigen ['re.U'] (https://docs.python.org/2/library/re.html#re.U) nicht, da Sie keine Kurzzeichen-Zeichenklassen verwenden. –

+0

@ WiktorStribiżew, du hast recht, und richtig :) Ich benutzte 're.U' von Gewohnheit, und überblickte die Gruppe Null. Ich werde die Antwort aktualisieren, danke. – randomir

+1

Das ist definitiv: das "Es sollte einen offensichtlichen Weg geben, es zu tun." für diesen Fall. – jsbueno

0

Nun ja, eine Sache, die ich sehe, ist, dass Ihre Funktion issubset, in diesem Fall nutzlos scheint. Wenn Sie absolut keine Funktion erstellen müssen können Sie diesen Code verwenden statt:

def pad_space_ifsubset(text): 
    output = "" 
    for ch in text: 
     if u'\u31c0' <= ch <= u'\u31ef': 
      output += " " + ch + " " 
     else: 
      output += ch 
    return output 

text = '这是个小㇈㇋伙子' 

pad_space_ifsubset(text) 

Für den Raum Polsterung, Sie viele Möglichkeiten haben, aber das ist das, was ich wählen würde:

output += ' %s ' %ch 

Beachten Sie, dass das, was Sie verwenden, meiner Meinung nach in Ordnung ist. Es ist ein wirklich einfacher Fall und Ihre Lösung zum Auffüllen von Leerzeichen ist lesbar.

Verwandte Themen