2017-05-02 3 views
0

Ich habe eine große Anzahl von Dateien mit $ Log erweitert-Keyword-Text am Ende, die gelöscht werden müssen. Ich suche, ein vorhandenes Python 2.7-Skript zu modifizieren, um dies zu tun, aber kann die Regex nicht richtig arbeiten lassen.

Der Text aus dem Ende einer Datei wie folgt aussieht abzustreifen:

/* 
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 
*/ 

Ich möchte oben, einschließlich die Anker Kommentar /* und */ und alles dazwischen gezeigt gesamten Text strippen.

schaute ich auf diese Fragen/Antworten und ein paar andere:

Python re.sub non-greedy mode ..

Python non-greedy rebexes

Der nächstgelegene ich in der Lage gewesen ist, mit zu bekommen:

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

Welche Natürlich hinterlässt die Öffnung /*.

folgende Worte gestrichen meine ganze Probe-Testdatei, da die Datei mit einem entsprechenden Kommentar öffnet (Ich dachte, die nicht gierige ? Modifikator dies verhindern würde):

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

ich mit der Verwendung von re.MULTILINE ohne Erfolg experimentiert .

Wie kann ein Regex in Python definiert werden, um den gesamten $ Log-Kommentar zu erhalten - UND keinen der vorherigen Kommentare in der Datei?

+0

ich habe noch einige Erläuterungen zu meiner Frage: machte Kommentar zu entfernendem allgemeinere, stellte fest, dass der Kommentar Anker '/ *' und ' */'und alles dazwischen muss entfernt werden, und frühere Kommentare in der Datei müssen unberührt bleiben. – Mutagon

Antwort

1

können Sie verwenden:

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

enter image description here


Regex Demo

Python Demo

+0

Mein ursprüngliches Ziel war es, von '/ *' nach '* /' und alles dazwischen zu entfernen. Es kann jedoch in Ordnung sein, die Kommentaranker und jeden harmlosen Text, der vor der $ Log-Zeile auftritt (wie die oben gezeigte Sternkette), zurückzulassen. – Mutagon

+0

Ich kann den Python-Demo-Link nicht öffnen. Von meiner Firewall blockiert :(Aber dein Beispiel ist nah - ich bekomme, was du oben zeigst, während ich möchte, dass der Text, den du in Ausgabe zeigst, auch gelöscht wird - ohne dass andere Kommentare in der Datei gelöscht werden. Ich werde herumspielen mit der Regex Demo Danke für die Bereitstellung – Mutagon

+0

Bitte testen Sie die aktualisierte Antwort –

0

Es ist ein bi t unklar, was Sie als Ausgabe erwarten. Mein Verständnis ist, dass Sie versuchen, den Kommentar zu extrahieren. Ich nehme an, dass der Kommentar in der 3. Zeile erscheint und Sie müssen nur die dritte Zeile mit Regex extrahieren. Regex Expression verwendet:

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

Nachdem die Regex für den Abgleich mit der dritten Gruppe wird der Kommentar wie in dem unten stehenden Link und Screenshot demonstriert. So kann blah blah blah mit .group(2) abgerufen werden. Hinzufügen von Python-Code unter:

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

Regex101: Beispielcode für Python verfügbar ist here.

Python Demo

enter image description here

+0

Mein Ziel ist eigentlich, den gesamten Kommentar von '/ *' nach '* /' zu entfernen, aber wie bei @PedroLobito gibt es Möglichkeiten, die meisten von t zu entfernen Er Inhalt des Kommentars, der in Ordnung sein könnte, wenn die Kommentaranker auch nicht einfach entfernt werden können. – Mutagon

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

Regex Explanation

+0

Willkommen bei StackOverflow und vielen Dank für Ihren Versuch zu helfen. Bitte nehmen Sie die [Tour], um viele nützliche Hinweise zu erhalten, wie Sie fragen und antworten können. Ihre Antwort hat einen externen Link als einzige Erklärung. Bei einer externen Verknüpfung wird in der Antwort eine kurze Zusammenfassung erwartet. Der Haupttrick, d. H. Der Teil, der tatsächlich die Lösung ist, ist ein wenig Zeit zum Eintippen wert und persönlicher hilfreicher als die erzeugte Beschreibung. Auch eine Verknüpfung mit der (nützlichen) Quelle dieses Bildes wäre hilfreicher. – Yunnosch

+0

Das funktioniert fast, aber gilt nur für das arme Beispiel, mit dem ich angefangen habe. Ich habe meinen Beispiel-Kommentar zum Entfernen aktualisiert, um allgemeiner zu sein. – Mutagon