split,rsplit与splitlines作用

  • 0 前言
  • 1 split
  • 2 rsplit
  • 3 splitlines


0 前言

在编程的过程中,字符串是我们最常打交道的数据类型,对字符串进行切分也是我们经常进行的操作。python提供了很多处理字符串的函数,处理起来非常方便。这里介绍python中与字符串切分相关的三个函数,分别是split,rsplit与splitlines。
首先需要明确的一点是三个函数的作用都是进行字符串切分。其中split函数是最基本的切分函数,rsplit与splitlines函数的功能,都能使用split函数实现,额外提供这两个函数,仅仅是为了操作方便而已。

1 split

语法:

str.split(separator,num)

其中str表示要切分的字符串,separator表示分隔符,num表示切分的次数,默认是-1。表示分割所有。
示例:

>>> str = 'C/C++/Python/Java'
>>> str_split = str.split('/')
>>> print(str_split)
['C', 'C++', 'Python', 'Java']
>>> str_split = str.split('/',1)

>>> print(str_split)
['C', 'C++/Python/Java']

另外需要说明的是,如果不指定分隔符,split将以空白符作为分割符。
关于python的split函数还有一个小小的坑。关于这个坑的详细内容请查看博客python字符串split的一个小坑。

2 rsplit

split函数默认是从左向右进行切割的,如果使用num参数指定只切割一次的话,那么就会从字符串传的左侧找到第一个匹配的分隔符进行切分,剩下的部分不再进行切分。
rsplit的意思是right split,就是从右侧进行切分。如果使用num参数指定只切割一次的话,那么就会从字符串传的右侧找到第一个匹配的分隔符进行切分,剩下的部分不再进行切分。

>>> str = 'C/C++/Python/Java'
>>> str_split = str.rsplit('/',1)
>>> print(str_split)
['C/C++/Python', 'Java']

同样,如果不指定分隔符,rsplit将以空白符作为分割符。

3 splitlines

splitlines的功能其实就是根据换行符进行split,其实就是根据\r, \r\n, \n进行分割。这三个都表示换行符,之所以状况,是由不同平台对换行符的定义不同产生的。
下面对不同平台对换行符的定义进行介绍。
我们使用notepad++打开,windows下编辑的文本文档,选择显示所有字符,每行的末尾都会显示- CR LF,而在linux平台下编辑的文本文档,每行的末尾显示为LF。这里的CR和LF是什么意思呢?

  • CR:Carriage Return,对应ASCII中转义字符\r,表示回车
  • LF:Linefeed,对应ASCII中转义字符\n,表示换行
  • CRLF:Carriage Return & Linefeed,\r\n,表示回车并换行
    所以:
  • Windows操作系统采用两个字符来进行换行,即CRLF;
  • Unix/Linux/Mac OS X操作系统采用单个字符LF来进行换行;
  • MacIntosh操作系统(即早期的Mac操作系统)采用单个字符CR来进行换行。

据说之所以产生现在的局面是由历史原因的。

据野史记载,在很久以前的机械打字机时代,CR和LF分别具有不同的作用:LF会将打印纸张上移一行位置,但是保持当前打字的水平位置不变;CR则会将“Carriage”(打字机上的滚动托架)滚回到打印纸张的最左侧,但是保持当前打字的垂直位置不变,即还是在同一行。
当CR和LF组合使用时,则会将打印纸张上移一行,且下一个打字位置将回到该行的最左侧,也就是我们今天所理解的换行操作。
随着时间的推移,机械打字机渐渐地退出了历史舞台,当初的纸张变成了今天的显示器,打字机的按键也演变为了如今的键盘。在操作系统出现的年代,受限于内存和软盘空间的不足,一些操作系统的设计者决定采用单个字符来表示换行符,如Unix的LF、MacIntosh的CR。他们的意图都是为了进行换行操作,只是当初并没有一个国际标准(或者其他原因,鬼知道),所以才有这样字符上的不同。

>>> str = 'C\rC++\nPython\r\nJava'
>>> str_split = str.splitlines()
>>> print(str_split)
['C', 'C++', 'Python', 'Java']

参考文章:

  1. CRLF、CR、LF详解