双换行分割,crlf优先

Split by double newline, prioritizing crlf

完成这个的天真的方法是:

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']。我可能需要某种占有欲或让它不回溯。有办法吗?

您可以使用环视来限制 \n\r 匹配位置,以避免在 CRLF 中匹配它们:

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

Python 测试:

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

查看正则表达式图:

详情

  • (?:\r\n|\r(?!\n)|(?<!\r)\n){2} - 匹配的 non-capturing 组(如果你是捕获组,最后一次迭代捕获的值也将输出到结果列表中 re.split)两次重复:
    • \r\n - CRLF 序列
    • | - 或
    • \r(?!\n) - CR 符号后面没有跟 LF
    • | - 或
    • (?<!\r)\n - LF 符号前面没有 CR。