2009-02-05 5 views
2

J'essaye d'ajouter un espace avant chaque majuscule, excepté le premier.Python regex: Tournez "ThisFileName.txt" en "This File Name.txt"

Voici ce que j'ai jusqu'à présent, et la sortie que je reçois:

>>> tex = "ThisFileName.txt" 
>>> re.sub('[A-Z].', ' ', tex) 
' his ile ame.txt' 

Je veux: « Ce fichier nom.txt »

(Ce serait bien si je pouvais aussi se débarrasser de txt, mais je peux le faire dans une opération séparée)

Répondre

9

concept clé ici est dans les expressions régulières des backreferences.

import re 
text = "ThisFileName.txt" 
print re.sub('([a-z])([A-Z])', r'\1 \2', text) 
# Prints: "This File Name.txt" 

Pour tirer au large de la 'txt' de manière fiable, je recommande os.path.splitext()

import os 
filename = "ThisFileName.txt" 
print os.path.splitext(filename) 
# Prints: ('ThisFileName', '.txt') 
2
re.sub('([a-z])([A-Z])', '\\1 \\2', 'TheFileName.txt') 

EDIT: StackOverflow mange un peu \ s, lorsqu'ils ne sont pas en mode 'code' ... Parce que j'oublié pour ajouter une nouvelle ligne après le code ci-dessus, il n'a pas été interprété en 'mode code': - ((. Depuis que j'ai ajouté ce texte, je n'ai rien changé et c'est correct maintenant.

+0

ajouter une autre barre oblique inverse: re.sub ('([az]) ([AZ])', « \\ 1 \\ 2 ', texte) ... l'une est interprétée comme une séquence d'échappement ... de la documentation: À moins qu'un préfixe' r 'ou' R 'soit présent, les séquences d'échappement dans les chaînes sont interprétées selon des règles similaires à ceux utilisés par la norme C. – bernie

+0

downvoting jusqu'à ce que l'erreur est fixée ... – Triptych

+0

n'était pas vraiment ma faute, je pense, fixé I de toute façon. (Voir mon EDIT: commentaire) –

2

Une autre expression régulière possible à l'aide d'un coup d'oeil derrière:

(?<!^)([A-Z]) 
1

On ne sait pas ce que vous voulez faire si le nom de fichier est Hello123There.txt. Donc, si vous voulez un espace avant toutes les lettres majuscules, quel que soit ce qui les précède, vous pouvez:

import re 

def add_space_before_caps(text): 
    "Add a space before all caps except at start of text" 
    return re.sub(r"(?<!^)(?=[A-Z])", " ", text) 

>>> add_space_before_caps("Hello123ThereIBM.txt") 
'Hello123 There I B M.txt'