2011-01-06 2 views
0

Existe-t-il un moyen de rechercher et de remplacer certaines chaînes, mais aussi de faire attention aux chaînes similaires et de ne pas les remplacer?recherche spécifique en python?

par exemple, si j'ai

self.a 
self.b 
self.c 
self.d 
self.e 
self.f 
self.g 

et je voulais

self.a 
self.__b 
self.c 
self.__d 
self.__e 
self.f 
self.g 

et je veux ajouter __ à certaines des variables pour les rendre privées, mais pas d'autres, comment pourrais-je faites-le, à moins de changer chacun individuellement, ou de les changer tous et ensuite défaire ceux que je ne veux pas? mon programme a un grand nombre de variables et utilise chacune d'entre elles très souvent, donc je ne veux pas passer par le code moi-même.

+3

N'est-ce pas un problème d'édition plus d'un problème de Python? Par exemple, vous pouvez utiliser votre éditeur pour remplacer "self.b" par "self .__ b", ou utiliser sed de la même manière. – Christian

Répondre

1

Sauvegardez votre script. Créez un nouveau script et import re, puis re.sub() votre script d'origine. Exécutez un test unitaire sur le script regex'd pour garantir la fonctionnalité.

3

Regular expressions?

Python's re module a une fonction appelée re.sub qui remplacera tout ce qui correspond à un motif avec autre chose.

Vous pouvez également utiliser des expressions régulières de Perl, awk, sed, etc. selon vos préférences. Il vous suffit de rechercher et de remplacer en fonction des modèles que vous souhaitez associer et modifier.

+1

+1 pour sed. Un one-liner fonctionnerait probablement et serait plus facile que d'écrire un script Python. – Hollister

1

Les expressions régulières sont votre ami ici. Ils sont un peu intensifs pour le débutant, cependant. Pour atteindre l'objectif dans l'exemple ci-dessus, utilisez la commande python:

import re 
pattern = r'(self\.)(b|d|e)\s' 
result = re.sub(pattern, '\1__\2', source) 

Cela prend tous les cas d'une chaîne commençant par « auto ». suivi de b, d ou e, et le remplace par un 'self .__' suivi de la chaîne correcte.

1

En plus de créer un autre script pour effectuer le remplacement, vous pouvez probablement le faire dans votre éditeur. Par exemple si vous utilisez le typage Vim ce qui suit devrait faire ce que vous voulez:

:%s/self\.\(b\|d\|e\)/self.__\1/g 
+0

Si vous n'utilisez pas Vim, mais utilisez une ligne de commande Unix/Linux, essayez 'sed 's/self \. \ (B \ | d \ | e \)/self .__ \ 1/g' your_python_module.py ' –