Frage zu re (Regulären Ausdrüchen)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Dereta
User
Beiträge: 3
Registriert: Dienstag 18. November 2014, 14:14

Hallo Python Gemeinschaft,

Ich arbeite seit geraumer Zeit mit Python, jedoch ist es mir schon des öfteren vorgekommen das ich
Probleme bei der umsetzung hatte. Meistens habe ich meine Hilfen online gesucht und auch gefunden.
Jedoch habe ich dabei nicht wirklich dazu gelernt wie die einzelnen Funktionen Arbeiten. Deswegen
bin ich nun auch hier, in der Hoffnung das ihr mir helfen könnt und mir auch erklären könnt warum etwas
so funktioniert wie es das tut.

Zu meinem Problem. Ich habe folgenden Code den ich über f.open('dateiname.txt', 'r') einlese.

Code: Alles auswählen

Das hier ist nur ein Beispiel Text. Hier
könnte alles mögliche Stehen.
Auch hier. --[[ Diese Zeichenfolge leitet ein mehrzeiliges Kommentar ein
das, wer hätte es gedacht sich über mehrere Zeilen erstreckt.
Und so endet es --]]
Das ist wieder sichtbarer Text. -- Dies ist ein einziliges Kommentar das bis an das Ende der Zeile geht
Und ich bin wieder Sichtbar
Nun würde ich gerne über re.sub() den text nach Kommentaren durchsuchen lassen und diese entfernen.
Aktuell arbeite ich mit folgender Funktion:

Code: Alles auswählen

fOpen = open(f, 'r')
fRCommand = re.sub("--\[\[.+--\]\]", "", fOpen.read())
fRCommand = re.sub("--[^\[\n]+", "", fRCommand)
print fRCommand
Er funktioniert zwar und erfüllt seine Funktion. Jedoch vermute ich das er verbesserungswürdig ist.

Ich danke vielmals für eure hilfe :3

Grüße Dereta
BlackJack

@Dereta: Das soll funktionieren? Glaube ich nicht. Das mehrzeilige Muster trifft nur wenn man die Option angibt, dass der '.' *alle* Zeichen zutrifft. Dann muss bei '.+' mindestens ein Zeichen da sein, einen leeren Kommentar erwischt man damit nicht. Und das ist auch greedy — da wird also bei dem mehrzeiligen Kommentar mehr erfasst als gewünscht ist, nämlich alles vom Anfang des ersten Kommentars bis zum Ende des letzten. Das ”funktioniert” also nur solange nur ein Mehrzeiliger Kommentar enthalten ist.
Dereta
User
Beiträge: 3
Registriert: Dienstag 18. November 2014, 14:14

Ich kann nur sagen das es bei mir so Funktioniert hat wie ich es verwendet habe :K
Warum weiß ich leider nicht. Deswegen habe ich ja auch darum gebeten das man
mir ein wenig helfen kann :oops:

Das habe ich Früher benutzt:
Bild

Grüße
BlackJack

@Dereta: Äh, das sind jetzt aber andere reguläre Ausdrücke als die von denen Du behauptet hast sie würden funktionieren. Und auch bei denen hast Du das Problem das die bei mehr als einem mehrzeiligem Kommentar zu viel erwischen. Nämlich wie gesagt alles vom Anfang des *ersten* mehzeiligen Kommentars bis zum Ende des *letzten* mehrzeiligen Kommentars. Aus:

Code: Alles auswählen

spam --[[ comment 1
--]]
ham --[[ comment 2
--]]
parrot
macht das:

Code: Alles auswählen

spam
parrot
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Dereta: das Problem ist, das re.sub keine Flags unterstützt. Du mußt also die regulären Ausdrücke mit re.compile zuerst übersetzen:

Code: Alles auswählen

multiline_comment = re.compile(r'--\[\[.*?--\]\]',re.DOTALL)
singleline_comment = re.compile(r'--.*$', re.M)
text = multiline_comment.sub('', text)
text = singleline_comment.sub('', text)
Der Punkt muß im ersten Fall auch newlines matchen, was Du in Deinem Bild über umwege machst, und bei Einzelzeilen muß $ für jedes Zeilenende stehen.
Dereta
User
Beiträge: 3
Registriert: Dienstag 18. November 2014, 14:14

Danke @Sirius3
und @BlackJack wie ich auch geschrieben habe "Das habe ich früher (davor) benutzt. Jedoch hatte ich auch dort Probleme.
Ich werde mal versuchen es einzusetzen und hoffe das alles Funktioniert.

Vielen Dank! Dereta
Antworten