2010-12-10 9 views
2

J'ai donc une variable qui a tout le code d'un fichier. Je dois supprimer tous les commentaires de ce fichier. L'une de mes lignes REGEXP cePetit problème avec reg exps en python

x=re.sub('\/\*.*\*\/','',x,re.M,re.S);

Ce que je veux que ce soit fait est de supprimer tous les commentaires de plusieurs lignes. Pour une raison étrange cependant, il saute deux instances de * /, et supprime tout jusqu'à la troisième instance de * /.

Je suis assez sûr que la raison est cette troisième instance de */a le code après, alors que les deux premiers sont eux-mêmes sur la ligne. Je ne sais pas pourquoi cela compte, mais je suis assez sûr que c'est pourquoi.

Des idées?

+1

Vous devriez essayer d'utiliser des chaînes brutes (ajoutez un r à la chaîne) afin de ne pas avoir trop d'échappées. – Falmarri

Répondre

4

.* correspondra toujours à autant de caractères que possible. Essayez (.*?) - la plupart des implémentations devraient essayer de faire correspondre le moins de caractères possible (cela devrait fonctionner sans les parenthèses mais je ne suis pas sûr maintenant). Donc, votre modèle entier devrait ressembler à ceci: \/\*.*?\*\/ ou \/\*(.*?)\*\/

+0

Ahh qui l'a fait. Merci! – john

+0

Oui, ça marchera sans parenthèse. – jwueller

1

L'expression .* est gourmande, ce qui signifie qu'elle tentera de faire correspondre autant de caractères que possible. Au lieu de cela, utilisez (.*?) qui arrêtera de faire correspondre les caractères dès que possible.

1

L'expression régulière est "gourmande" et lorsqu'elle est présentée avec plusieurs points d'arrêt, elle prend la plus éloignée. Regex a quelques modèles pour aider à contrôler ce, en particulier le

(? & gt! ...)

qui correspond à l'expression suivante que si elle est pas précédée par un match du motif en parens. (mettre dans une accolade pointue pour & gt dans le dessus - je ne connais pas la convention du forum pour aller dans ma réponse).

(? * ...) n'était pas dans Python 2.4 mais est un bon choix si vous utilisez une version plus récente.

+0

Je pense que vous parlez de '(?