完成此操作的天真的方法是:
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']
。我可能需要某种占有欲,或使其无法回溯。有办法吗?
答案 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']
查看正则表达式图:
详细信息
(?:\r\n|\r(?!\n)|(?<!\r)\n){2}
-一个非捕获组(如果您正在捕获一个组,则最后一次迭代捕获的值也将通过re.split
输出到结果列表中),该组与以下两个重复项匹配:
\r\n
-CRLF序列|
-或\r(?!\n)
-CR符号后没有LF |
-或(?<!\r)\n
-LF符号前面没有CR。