用双换行符分割,优先处理crlf

时间:2019-06-18 10:39:59

标签: python regex split newline backtracking

完成此操作的天真的方法是:

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 个答案:

答案 0 :(得分:1)

您可以使用环视法来限制\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']

查看正则表达式图:

enter image description here

详细信息

  • (?:\r\n|\r(?!\n)|(?<!\r)\n){2}-一个非捕获组(如果您正在捕获一个组,则最后一次迭代捕获的值也将通过re.split输出到结果列表中),该组与以下两个重复项匹配:
    • \r\n-CRLF序列
    • |-或
    • \r(?!\n)-CR符号后没有LF
    • |-或
    • (?<!\r)\n-LF符号前面没有CR。