Die im Dunkeln sieht man nicht
Ich habe mir ein kleines Script geschrieben, was mir helfen soll Fehler die ich häufiger in AsciiDoc-Dokumenten mach schnell zu finden.
Vereinfacht gesagt wird dabei eine Datei Zeile für Zeile eingelesen und gegen eine Menge reguläre Ausdrücke geprüft.
U.a. muss erkant werden ob eine Zeile den Beginn eines Block enthält, ein Block wird so eingeleitet:
Der Code der darauf prüft sah dann entsprechend so aus:
import re
with open(filepath, "r", "utf-8") as fh:
for line in fh:
if re.fullmacht("----",line):
do whatever
fullmatch wendet den regulären Ausdruck auf den gesamten String an → regulärer Ausdruck und String müssen von Anfang bis Ende übereinstimmen.
Das habe ich hier gewählt, weil in der Zeile sonst nichts anderes vorhanden sein darf, nur "----".
Seltsamerweise matchte der reguläre Ausdruck nie, obwohl in der Datei auf einer Zeile definitiv "----" stand und sonst nichts.
Ich habe dann in in einem Python-REPL getestet:
import re
a="----"
re.fullmatch("----", a)
und das funktionierte wunderbar.
Auch ein Check in https://regex101.com/ (sehr hilfreiche Seite, wer das auch so sieht, sollte unbedingt spenden) matchte.
Warum funktionierte es also nicht wenn man aus einer Datei ließt?
Weil wenn man eine Zeile aus einer Datei ließt dort nicht nur der Inhalt steht, sondern auch Steuerzeichen - nur sieht man die nicht.
Genaugenommen stand in der Zeile in der Datei:
----\n
und da ein re.fullmatch auf die ganze Zeie angewendet wird und "----" nicht mit "----\n" übereinstimmt matcht es nicht.
Ergo, wenn man aus Dateien ließt und Strings vergleicht sollte man sich gewahr sein, dass man immer mindestens noch die Line-Breaks - \n in Linux/Mac, \r\n in Windows - am Ende des Strings hat.