Python 换行符和多行模式

扫一扫,用手机分享

Python 的正则表达式支持 多行模式,将每行文字分别匹配。然而各种操作系统里,换行符的表示法各不相同,会导致 Python 不能正确使用多行模式。

目录

花式换行符

不同操作系统下, 换行符的表示方法 也不同。主要有以下三种:

操作系统 换行符名称 16 进制值 10 进制值 转义表示
Unix、Linux LF 0A 10 \n
Windows、DOS CR LF 0D 0A 13 10 \r \n
Mac CR 0D 13 \r

测试 Python 的表现

如果 Python 不能正确识别换行符,就无法按照期望,进入多行模式的匹配模式

可以使用下面的脚本来检验各种换行符下,不同版本Python 能否正确进入多行模式。脚本如下:

import re

print(re.findall(r"^\w+$", "hello\r\nbye\r\n", re.M))

如果结果是 ['hello', 'bye'] ,说明正确进入了多行模式;而如果结果是 [] , 则说明没有正常进入多行模式。

测试结果

操作系统 换行符表示 Python 2.7 Python 3.6
Unix、Linux \n ['hello', 'bye'] ✔ ['hello', 'bye'] ✔
Windows、DOS \r \n [] ✘ [] ✘
Mac \r [] ✘ [] ✘

测试结果说明,只有 \n 这种换行符能成功将 Python 带入 多行模式。

如何分辨换行符

那么面对传来的字节流,无论是来自文件、网络,如何知道其中的换行符是 上节 中的那种呢?我们需要以将字符串用二进制形式表达。

下面这个脚本可以观察字节流的二进制表示:

s=["hello\n","hello\r\n","hello\r"]
for y in s: print(' '.join(format(ord(x), 'b') for x in y))

得到结果为:

1101000 1100101 1101100 1101100 1101111 1010  #\n
1101000 1100101 1101100 1101100 1101111 1101 1010 #\r\n
1101000 1100101 1101100 1101100 1101111 1101 #\r

如何纠正

那么怎么将换行符调整到 适合 Python 进入多行模式的呢?可以使用 re.sub() 查找替换函数:

print(re.findall(r"^\w+$", re.sub(r"\r","\n",s), re.M))

或者

print(re.findall(r"^\w+$", re.sub(r"\r","",s), re.M))

将所有的 \r 删除或者 替换为 \n ,就能正确识别出换行符。


坚持原创不易。如果您觉得有收获,请考虑资助本站,以期待更多原创文章。

打赏作者,支持小站

相关文章

本站是个人博客。除非特别说明,所有文章均系原创,并采用 署名协议 CC-BY 授权。
欢迎转载,惟请保留原文链接:https://www.lfhacks.com/tech/python-newline-multiline