2017-06-20 4 views
1

le vrai problème peut être plus compliqué, mais pour l'instant, j'essaie d'accomplir quelque chose d'un peu plus facile. J'essaye d'enlever l'espace entre 2 caractères chinois/japonais, mais en même temps en maintenant l'espace entre un nombre et un caractère. Un exemple ci-dessous:Python - Comment supprimer les espaces entre les caractères chinois tout en restant les espaces entre un caractère et un nombre?

text = "今天特别 热,但是我买了 3 个西瓜。" 

La sortie que je veux est

text = "今天特别热,但是我买了 3 个西瓜。" 

j'ai essayé d'utiliser des scripts Python et d'expression régulière:

import re 
text = re.sub(r'\s(?=[^A-z0-9])','') 

Cependant, le résultat est

text = '今天特别热,但是我买了 3个西瓜。' 

Alors je me bats Comment puis-je maintenir l'espace entre un personnage et un nombre à tout moment? Et je ne veux pas utiliser une méthode d'ajout d'un espace entre "3" et "个".

Je vais continuer à y penser, mais laissez-moi savoir si vous avez des idées ... Merci beaucoup d'avance!

+0

Juste pour vous assurer: est-ce Python 3? –

+0

@ WiktorStribiżew yep – Penny

+1

Essayez 're.sub (? <= [^ \ W \ d _]) \ s + (? = [^ \ W \ d_]) ',' ', texte)' si vous devez supprimer 1 + espaces entre les lettres. –

Répondre

1

Je comprends que les espaces que vous devez supprimer résident entre les lettres.

Utilisez

re.sub(r'(?<=[^\W\d_])\s+(?=[^\W\d_])', '', text) 

Détails:

  • (?<=[^\W\d_]) - un lookbehind positif nécessitant une lettre Unicode immédiatement à gauche de l'emplacement actuel
  • \s+ - 1+ espaces blancs (enlever + si un seul est attendu)
  • (?=[^\W\d_]) - une vue d'ensemble positive qui nécessite une lettre Unicode immédiatement à droite de l'emplacement actuel.

Vous n'avez pas besoin du drapeau re.U car il est activé par défaut dans Python 3. Vous en avez besoin dans Python 2.

Vous pouvez également utiliser des groupes de capture:

re.sub(r'([^\W\d_])\s+([^\W\d_])', r'\1\2', text) 

où les lookarounds non consommateurs sont transformés en consommateurs groupes de capture ((...)). Les codes \1 et \2 dans le modèle de remplacement sont des références arrières aux valeurs de groupe de capture.

Voir un Python 3 online demo:

import re 
text = "今天特别 热,但是我买了 3 个西瓜。" 
print(re.sub(r'(?<=[^\W\d_])\s+(?=[^\W\d_])', '', text)) 
// => 今天特别热,但是我买了 3 个西瓜。 
+1

Merci beaucoup! – Penny