Vielleicht liegt es daran, dass das Einfügen eines zusätzlichen Zeichens in der Mitte des Strings ihn zerstört.
Wenn Sie den Text "hello \r world" ersetzen, muss die Größe des gesamten Strings tatsächlich um ein Zeichen auf "hello \r\n world" erhöht werden.
Ich würde vorschlagen, den String zu durchlaufen und Zeichen einzeln zu betrachten. Wenn es kein \r oder \n ist, fügen Sie es einfach dem neuen String hinzu. Wenn es ein \r oder \n ist, fügen Sie dem neuen String die richtigen Werte hinzu.
Code in C# (die Umwandlung in Python sollte trivial sein)
string FixLineEndings(string input)
{
if (string.IsNullOrEmpty(input))
return string.Empty;
StringBuilder rv = new StringBuilder(input.Length);
for(int i = 0; i < input.Length; i++)
{
char c = input[i];
if (c != '\r' && c != '\n')
{
rv.Append(c);
}
else if (c == '\n')
{
rv.Append("\r\n");
}
else if (c == '\r')
{
if (i == input.Length - 1)
{
rv.Append("\r\n"); //a \r at the end of the string
}
else if (input[i + 1] != '\n')
{
rv.Append("\r\n");
}
}
}
return rv.ToString();
}
Das war interessant genug, um ein Beispielprogramm zum Testen zu schreiben. Ich habe den in einer anderen Antwort gegebenen Regex verwendet und der Code für die Verwendung des Regex war:
static readonly Regex _r1 = new Regex(@"(?
Ich habe mit einer Reihe von Testfällen experimentiert. Die Ausgaben lauten:
\------------------------
Größe: 1000 Zeichen
All\\r
String: 00:00:00.0038237
Regex : 00:00:00.0047669
All\\r\\n
String: 00:00:00.0001745
Regex : 00:00:00.0009238
All\\n
String: 00:00:00.0024014
Regex : 00:00:00.0029281
Kein \\r oder \\n
String: 00:00:00.0000904
Regex : 00:00:00.0000628
\\r an jeder 100. Position und \\n an jeder 102. Position
String: 00:00:00.0002232
Regex : 00:00:00.0001937
------------------------
Größe: 10000 Zeichen
All\\r
String: 00:00:00.0010271
Regex : 00:00:00.0096480
All\\r\\n
String: 00:00:00.0006441
Regex : 00:00:00.0038943
All\\n
String: 00:00:00.0010618
Regex : 00:00:00.0136604
Kein \\r oder \\n
String: 00:00:00.0006781
Regex : 00:00:00.0001943
\\r an jeder 100. Position und \\n an jeder 102. Position
String: 00:00:00.0006537
Regex : 00:00:00.0005838
was zeigt, dass die String-Ersetzungsfunktion in Fällen, in denen die Anzahl der \r und \n hoch ist, besser abschneidet. Für den regulären Gebrauch ist jedoch der ursprüngliche Regex-Ansatz viel schneller (siehe den letzten Satz von Testfällen - diejenigen ohne \r\n und mit wenigen \r's und \n's)
Natürlich wurde dies in C# und nicht in Python programmiert, aber ich vermute, dass es Ähnlichkeiten in den Laufzeiten über die Sprachen hinweg gibt