Python 换行符和多行模式

2018-09-06
标签: PYTHON
本文发布至今已有5年零227天,可能不再适用,请谨慎对待。

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

花式换行符

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

操作系统换行符名称16 进制值10 进制值转义表示
Unix、LinuxLF0A10\n
Windows、DOSCR LF0D 0A13 10\r \n
MacCR0D13\r

测试 Python 的表现

如果 Python 不能正确识别换行符,就无法按照期望,进入Python 正则表达式里的单行s和多行m模式

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

import re

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

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

测试结果

操作系统换行符表示Python 2.7Python 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 ,就能正确识别出换行符。

如果您对本站内容有疑问或者寻求合作,欢迎 联系邮箱邮箱已到剪贴板

标签: PYTHON

欢迎转载本文,惟请保留 原文出处 ,且不得用于商业用途。
本站 是个人网站,若无特别说明,所刊文章均为原创,并采用 署名协议 CC-BY-NC 授权。