Разделить двойным переводом строки, расставив приоритеты - PullRequest
1 голос
/ 18 июня 2019

Наивный способ сделать это:

import re
re.split(r'(?:\r\n|\r|\n){2}', '...')

Но:

>>> re.split(r'(?:\r\n|\r|\n){2}', '\r\n\r\n\r\n')
['', '', '']

Я бы хотел получить ['', '\r\n'] в этом случае.Я, вероятно, нуждаюсь в какой-то собственности или не возвращаюсь назад.Есть ли способ?

1 Ответ

1 голос
/ 18 июня 2019

Вы можете ограничить совпадения позиций \n и \r, используя обходные пути, чтобы избежать их соответствия в CRLF:

r'(?:\r\n|\r(?!\n)|(?<!\r)\n){2}'

Python test:

>>> import re
>>> re.split(r'(?:\r\n|\r(?!\n)|(?<!\r)\n){2}', '\r\n\r\n\r\n')
['', '\r\n']

См. График регулярных выражений:

enter image description here

Детали

  • (?:\r\n|\r(?!\n)|(?<!\r)\n){2} - группа без захвата (если вы ее захватываете, значение, захваченное на последней итерации, будет также выведено в итоговый список с re.split), которое соответствует двум повторениям:
    • \r\n - последовательность CRLF
    • | - или
    • \r(?!\n) - символ CR не сопровождается LF
    • | - или
    • (?<!\r)\n - символу НЧ не предшествует CR.
...