Может быть, это тот факт, что вставка дополнительного символа в середине строки убивает его.
Когда вы подставляете текст "hello \ r world", он должен фактически увеличить размер всей строки на один символ до "hello \ r \ n world".
Я бы предложил перебирать строку и смотреть на символы один за другим. Если это не \ r или \ n, просто добавьте его к новой строке. Если это \ r или \ n, добавьте новую строку с правильными значениями
Код в C # (преобразование в python должно быть тривиальным)
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();
}
Это было достаточно интересно, чтобы написать пример программы для тестирования. Я использовал регулярное выражение, приведенное в другом ответе, и код для использования регулярного выражения:
статическое только для чтения Regex _r1 = new Regex (@ "(?
Я пытался с кучей тестов. Выходы:
------------------------
Size: 1000 characters
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
No \r or \n
String: 00:00:00.0000904
Regex : 00:00:00.0000628
\r at every 100th position and \n at every 102th position
String: 00:00:00.0002232
Regex : 00:00:00.0001937
------------------------
Size: 10000 characters
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
No \r or \n
String: 00:00:00.0006781
Regex : 00:00:00.0001943
\r at every 100th position and \n at every 102th position
String: 00:00:00.0006537
Regex : 00:00:00.0005838
, которая показывает, что функция замены строк работает лучше в случаях, когда число \ r и \ n велико. Для регулярного использования, хотя оригинальный подход регулярных выражений намного быстрее (см. Последний набор тестов - те, которые без \ r \ n и с небольшим количеством \ r и \ n)
Это, конечно, было написано на C #, а не на Python, но я предполагаю, что во времени выполнения между языками будут сходства