2010-06-11 6 views
2

J'essaie d'utiliser l'expression régulière pour rechercher un document pour un numéro UUID et remplacer la fin de celui-ci par un nouveau numéro. Le code que j'ai jusqu'ici est:Rechercher une chaîne et la remplacer par une variable

read_file = open('test.txt', 'r+') 
write_file = open('test.txt', 'w') 

r = re.compile(r'(self.uid\s*=\s*5EFF837F-EFC2-4c32-A3D4\s*)(\S+)') 
for l in read_file: 
    m1 = r.match(l) 
    if m1: 
     new=(str,m1.group(2)) 
     new?????? 

Ceci où je suis coincé.

Le fichier test.txt a le dessous UUID mémorisés:

self.uid = '5EFF837F-EFC2-4c32-A3D4-D15C7F9E1F22' 

Je veux remplacer la pièce D15C7F9E1F22.

J'ai aussi essayé:

r = re.compile(r'(self.uid\s*=\s*)(\S+)') 
for l in fp: 
    m1 = r.match(l) 
    new=map(int,m1.group(2).split("-") 
    new[4]='RHUI5345JO' 

Mais je ne peux pas sembler correspondre à la chaîne.

Merci d'avance pour toute aide.

+0

Je l'ai corrigé et testé: essayez-le maintenant. –

+0

Parlez-vous de mon expression rationnelle générale? Je l'ai réparé aussi. Désolé pour l'erreur. –

Répondre

3

Pourquoi utilisez-vous un regex pour un tel droit substitution directe?

Ne pourriez-vous simplement utiliser

for l in read_file: 
    l.replace("5EFF837F-EFC2-4c32-A3D4-D15C7F9E1F22", 
       "5EFF837F-EFC2-4c32-A3D4-RHUI5345JO") 
    # Write to file.. 

ou est-il plus à l'histoire que vous nous dites? Aussi, à moins que ce ne soit un fichier trop gros, je vous recommande de lire le fichier entier dans une chaîne et de ne faire qu'un seul remplacement par souci de rapidité.

1

Je pense que l'expression régulière est désactivée:

r = re.compile(r'(self.uid\s*=\s*5EFF837F-EFC2-4c32-A3D4\s*)(\S+)') 

devrait être:

r = re.compile(r"(self\.uid\s*=\s*'5EFF837F-EFC2-4c32-A3D4-)([^']*)'") 

Ensuite, lorsque vous avez un match, un groupe de saisir 1 et l'assigner à une variable et ajoutez votre remplacement chaîne à elle.

Le groupe ([^']*) recherchera n'importe quel caractère jusqu'à la marque '. C'est votre groupe de suppression cible. Justin Peel a un bon point:

Édition: 11 juin 2010 @ 2:27 EST: Vous pouvez faire une recherche directe et remplacer par ces données. À moins que vous êtes à la recherche pour le modèle de 8 caractères, suivi de 4, 4, 4 et 12 ... Dans ce cas, vous pouvez utiliser le modèle:

r = re.compile(r"self\.uid\s*=\s*('\w{8}-(:?\w{4}-){3})(\w{12})'") 
+0

Je reçois une erreur de syntaxe pour cette solution? – chrissygormley

+0

Merci pour l'aide mais il y a un support supplémentaire. J'ai essayé de l'enlever mais je ne peux pas lire la chaîne. J'ai peut-être retiré le support au mauvais endroit. – chrissygormley

Questions connexes