2017-05-02 1 views
0

J'ai un grand nombre de fichiers avec le mot-clé $ Log à la fin qui doit être supprimé. Je cherche à modifier un script python 2.7 existant pour le faire mais je ne peux pas faire fonctionner correctement l'expression rationnelle.

Le texte à bande de la fin d'un fichier ressemble à ceci:

/* 
one or more lines of .. 
.. possible text 
$Log: oldfile.c,v $ 
Revision 11.4 2000/01/20 19:01:41 userid 
a bunch more text .. 
.. of unknown number of lines 
*/ 

Je veux dépouiller tout le texte ci-dessus, y compris les ancres de commentaire /* et */ et tout le reste.

Je regardais ces questions/réponses et quelques autres:

Python re.sub non-greedy mode ..

Python non-greedy rebexes

Le plus proche que je suis en mesure d'obtenir est avec:

content = re.sub(re.compile(r'\$Log:.*', re.DOTALL), '', content) 

Lequel bien sûr laisse derrière l'ouverture /*.

Voici supprimé mon fichier de test d'échantillon entier car le fichier commence par un commentaire correspondant (je pensais que le modificateur ? non gourmand empêcherait cela):

content = re.sub(re.compile(r'^/\*.*?\$Log:.*', re.DOTALL), '', content) 

J'ai expérimenté avec l'aide re.MULTILINE sans succès .

Comment une expression régulière peut-elle être définie en Python pour récupérer l'ensemble du commentaire $ Log - ET aucun des commentaires précédents dans le fichier?

+0

J'ai ajouté quelques éclaircissements à ma question: a fait le commentaire à enlever plus général, a noté que les points d'ancrage de commentaire '/ *' et ' */'et tous les éléments intermédiaires doivent être supprimés, et les commentaires antérieurs du fichier doivent rester intacts. – Mutagon

Répondre

1

Vous pouvez utiliser:

result = re.sub(r"/\*\s+\*+\s+\$Log.*?\*/", "", subject, 0, re.DOTALL) 

enter image description here


Regex Demo

Python Demo

+0

Mon but initial était de supprimer '/ *' à '* /' et tout le reste. Cependant, il peut être acceptable de laisser derrière les ancres de commentaire et tout texte inoffensif qui se produit avant la ligne $ Log (comme la chaîne d'astérisques ci-dessus). – Mutagon

+0

Je ne peux pas ouvrir le lien Python Demo. Bloqué par mon pare-feu :(Mais votre exemple est proche - j'obtiens ce que vous montrez ci-dessus, alors que je voudrais que le texte que vous affichez en sortie soit également supprimé - sans que d'autres commentaires soient également supprimés dans le fichier. – Mutagon

+0

Veuillez tester la réponse mise à jour –

0

Il est bi t ne sait pas ce que vous attendez de la sortie. Je crois savoir que vous essayez d'extraire le commentaire. Je suppose que le commentaire apparaît sur la troisième ligne et vous devez simplement extraire la troisième ligne en utilisant regex. Regex Expression utilisée:

(\$Log:.*[\r\n]*.*[\r\n])(.*) 

Après avoir utilisé l'expression rationnelle pour le troisième groupe sera le commentaire comme le montre le lien et capture d'écran ci-dessous. Donc blah blah blah peut être récupéré en utilisant .group(2). Ajout de code python ci-dessous:

matches = re.search(r"(\$Log:.*[\r\n]*.*[\r\n])(.*)", content) 
print matches.group(2) 
// Output: blah blah blah 

Regex101: Exemple de code pour python est disponible here.

Python Demo

enter image description here

+0

Mon but est en fait de supprimer le commentaire entier de '/ *' à '* /'. Mais comme la réponse de @PedroLobito, cela présente des possibilités de supprimer la plupart des Le contenu du commentaire, ce qui pourrait convenir si les ancres de commentaire ne peuvent pas être facilement supprimées. – Mutagon

0
content = re.sub(re.compile(r'\/\*\n\**\n\$Log(?:.|[\n])*\*\/', re.DOTALL), '', content) 

Regex Explanation

+0

Bienvenue sur StackOverflow et merci pour votre aide. S'il vous plaît, prenez le [tour] pour obtenir de nombreux conseils utiles sur la façon de demander et de répondre. Votre réponse a un lien externe comme seule explication. Lors d'une liaison externe, un bref résumé est attendu dans la réponse. L'astuce principale, c'est-à-dire la partie qui est en fait la solution, vaut un peu de temps pour la taper et plus utile personnellement que la description générée. Un lien vers la source (utile) de cette image serait également plus utile. – Yunnosch

+0

Cela fonctionne presque mais ne s'applique qu'à l'exemple pauvre que j'ai commencé avec. J'ai mis à jour mon exemple comment-to-remove pour être plus général. – Mutagon