双换行分割,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。
完成这个的天真的方法是:
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。