字符串方法(二)
本文作者:田志凡
文字编辑:宁刘莹
技术总编:张 邯
上期说到关于字符串查找、替换的方法,本文将介绍字符串分割、穿插与填充以及删除的几个相关方法,今天依然使用上期的两个字符串作为被处理对象,如下:
In [1]: str1 = '''我国地域辽阔,花卉种类繁多,能够被全国人民普遍接受的,主要集中在牡丹、梅花、菊花、兰花、月季、茶花、 荷花等大众化花卉上。\n这些花卉各有特色,具有不同的历史传统和文化优势,众里挑一,确实不易。一些地方努力将本地特色花卉推选成国花,固然有弘扬本地花卉文化的初衷,也不排除有商业利益的考量。\n一旦被选为国花,将会被广泛种植、被大力商业开发,甚至形成庞大产业链,产生巨大经济效益,而拥有国花资源的地方,将成为最大赢家。'''
In [2]: str2 = '''The China Flower Association (CFA) said in a recent statement that the peony was recommended as China’s national flower, sparking heated debate online.'''
一、字符串方法之“分割”
(1)按分隔符分割为两部分
partition:从左往右检索分隔符,返回包含分隔符前的子字符串、分隔符本身以及分隔符后的子字符串,组成含有三个元素的元组。
rpartition:从右往左检索分隔符,其余功能与partition方法相同。
举例如下,按照“。”分割str1,使用partition将第一句话与后文分隔开,而rpartition则将最后的句号检索到,返回的元组中分隔符后面的子字符串为空值。
In [28]: str1.partition('。')
Out[28]: ('我国地域辽阔,花卉种类繁多,能够被全国人民普遍接受的,主要集中在牡丹、梅花、菊花、兰花、月季、茶花、 荷花等大众化花卉 上', '。', '这些花卉各有特色,具有不同的历史传统和文化优势,众里挑一,确实不易。一些地方努力将本地特色花卉推选成国花,固然有弘扬本地花卉文化的初衷,也不排除有商业利益的考量。一旦被选为国花,将会被广泛种植、被大力商业开发,甚至形成庞大产业链,产生巨大经济效益,而拥有国花资源的地方,将成为最大赢家。')
In [29]: str1.rpartition('。')
Out[29]: ('我国地域辽阔,花卉种类繁多,能够被全国人民普遍接受的,主要集中在牡丹、梅花、菊花、兰花、月季、茶花、 荷花等大众化花卉 上。这些花卉各有特色,具有不同的历史传统和文化优势,众里挑一,确实不易。一些地方努力将本地特色花卉推选成国花,固然有弘扬本地花卉文化的初衷,也不排除有商业利益的考量。一旦被选为国花,将会被广泛种植、被大力商业开发,甚至形成庞大产业链,产生巨大经济效益,而拥有国花资源的地方,将成为最大赢家', '。', '')
(2)按分隔符分割为多个部分
split:使用sep参数指定分隔符将字符串进行分割,分割出来的子字符串组成一个列表,不包含分隔符本身,可使用maxsplit参数指定分割的次数。
rsplit:从右端开始分割,其余与split相同。
举例如下,我们使用逗号来分割str1,使用空格来分割str2,结果如下,分割出来的子字符串组成一个列表。
In [30]: str1.split(sep=',')
Out[30]: ['我国地域辽阔', '花卉种类繁多', '能够被全国人民普遍接受的', '主要集中在牡丹、梅花、菊花、兰花、月季、茶花、 荷花等大众 化花卉上。这些花卉各有特色', '具有不同的历史传统和文化优势', '众里挑一', '确实不易。一些地方努力将本地特色花卉推选成国花', '固然有弘扬本地花卉文化的初衷', '也不排除有商业利益的考量。一旦被选为国花', '将会被广泛种植、被大力商业开发', '甚至形成庞大产业链', '产生巨大经济效益', '而拥有国花资源的地方', '将成为最大赢家。']
In [31]: str2.split(sep=' ')
Out[31]: ['The', 'China', 'Flower', 'Association', '(CFA)', 'said', 'in', 'a', 'recent', 'statement', 'that', 'the', 'peony', 'was', 'recommended', 'as', 'China’s', 'national', 'flower,', 'sparking', 'heated', 'debate', 'online.']
指定分割次数,如下结果所示,str1和str2只被分割了一次,返回的列表中只有两个元素,并且是以从左遍历到的第一个分隔符为分割界限的。
In [32]: str1.split(sep=',',maxsplit=1)
Out[32]: ['我国地域辽阔', '花卉种类繁多,能够被全国人民普遍接受的,主要集中在牡丹、梅花、菊花、兰花、月季、茶花、 荷花等大众化花 卉上。这些花卉各有特色,具有不同的历史传统和文化优势,众里挑一,确实不易。一些地方努力将本地特色花卉推选成国花,固然有弘扬本地花卉文化的初衷,也不排除有商业利益的考量。一旦被选为国花,将会被广泛种植、被大力商业开发,甚至形成庞大产业链,产生巨大经济效益,而拥有国花资源的地方,将成为最大赢家。']
In [33]: str2.split(sep=' ',maxsplit=1)
Out[33]: ['The', 'China Flower Association (CFA) said in a recent statement that the peony was recommended as China’s national flower, sparking heated debate online.']
从右端开始分割需使用rsplit,其他的与split一致,此处仅以指定分隔符和分割次数为例做个简单地展示,如下:
In [34]: str1.rsplit(sep=',',maxsplit=1)
Out[34]: ['我国地域辽阔,花卉种类繁多,能够被全国人民普遍接受的,主要集中在牡丹、梅花、菊花、兰花、月季、茶花、 荷花等大众化花卉 上。这些花卉各有特色,具有不同的历史传统和文化优势,众里挑一,确实不易。一些地方努力将本地特色花卉推选成国花,固然有弘扬本地花卉文化的初衷,也不排除有商业利益的考量。一旦被选为国花,将会被广泛种植、被大力商业开发,甚至形成庞大产业链,产生巨大经济效益,而拥有国花资源的地方', '将成为最大赢家。']
In [35]: str2.rsplit(sep=' ',maxsplit=1)
Out[35]: ['The China Flower Association (CFA) said in a recent statement that the peony was recommended as China’s national flower, sparking heated debate', 'online.']
(3)按行分割
splitlines:按照行边界进行分割,结果中不包含行边界,各行的内容组成一个列表。这里所谓的行边界是计算机解读文本流中产生的关于“行结束”的一个概念,在不同的系统下,关于什么是“行”的边界概念有所不同,在Unix中,约定 '\n'为行结束标识,在Windows 中则约定 为'\r\n' 。Python中,以下表示符都会被解读成行边界,如下:
为了演示行分割,我们在str1中加入几个行边界:
In [36]: str1 = '''我国地域辽阔,花卉种类繁多,能够被全国人民普遍接受的,主要集中在牡丹、梅花、菊花、兰花、月季、茶花、 荷花等大众化花卉上。\n这些花卉各有特色,具有不同的历史传统和文化优势,众里挑一,确实不易。\r一些地方努力将本地特色花卉推选成国花,固然有弘扬本地花卉文化的初衷,也不排除有商业利益的考量。\r\n一旦被选为国花,将会被广泛种植、被大力商业开发,甚至形成庞大产业链,产生巨大经济效益,而拥有国花资源的地方,将成为最大赢家。'''
In [37]: str1.splitlines()
Out[37]: ['我国地域辽阔,花卉种类繁多,能够被全国人民普遍接受的,主要集中在牡丹、梅花、菊花、兰花、月季、茶花、 荷花等大众化花卉 上。', '这些花卉各有特色,具有不同的历史传统和文化优势,众里挑一,确实不易。', '一些地方努力将本地特色花卉推选成国花,固然有弘扬本地花卉文化的初衷,也不排除有商业利益的考量。', '一旦被选为国花,将会被广泛种植、被大力商业开发,甚至形成庞大产业链,产生巨大经济效益,而拥有国花资源的地方,将成为最大赢家。']
列表中的元素表示str1在’\n’、‘\r’和‘\r\n’处被切割,此时每个元素表示阅读习惯中的一个段落的文字。
此方法默认不保留行边界,但是指定keepends参数为真时可以只切割不去掉行边界,如下:
In [38]: str1.splitlines(keepends=True)
Out[38]: ['我国地域辽阔,花卉种类繁多,能够被全国人民普遍接受的,主要集中在牡丹、梅花、菊花、兰花、月季、茶花、 荷花等大众化花卉 上。\n', '这些花卉各有特色,具有不同的历史传统和文化优势,众里挑一,确实不易。\r', '一些地方努力将本地特色花卉推选成国花,固然有弘扬本地花卉文化的初衷,也不排除有商业利益的考量。\r\n', '一旦被选为国花,将会被广泛种植、被大力商业开发,甚至形成庞大产业链,产生巨大经济效益,而拥有国花资源的地方,将成为最大赢家。']
二、字符串方法之“穿插与填充”
(1)穿插
join:将某一字符串穿插到一个序列中,常见的序列有字符串、元组、字典、列表等,相当于用这个字符串将序列的各个元素连接起来,生成一个新的字符串。
举例如下,将str2用空格分开得到的列表重新用“|”连接起来得到新的字符串:
In [39]: '|'.join(str2.split(sep=' '))
Out[39]: 'The|China|Flower|Association|(CFA)|said|in|a|recent|statement|that|the|peony|was|recommended|as|China’s|national|flower,|sparking|heated|debate|online.'
在实操中,当我们将爬下来的信息写入.csv文件时,可以用'\t'.join( )将存放在列表中的信息用制表符连接起来生成一个字符串写入目标文件。
(2)填充字符
ljust:原字符串居左对齐,以指定字符串从右端进行填充,达到指定长度,默认以空格填充。
rjust:原字符串居右对齐,以指定字符串从左边进行填充,其他与ljust的一样。
zfill:从字符串左边填充0(zero),使字符串达到指定的长度,若原字符串最左边是+-号,则在正负号的右侧填充0。
center:以原字符串为中心,左右两边进行填充指定字符,达到指定长度。
举例如下:我们以字符串“StataClub”为例来展示。
In [40]: s='StataClub'
In [41]: s.ljust(11,'A')
Out[41]: 'StataClubAA'
In [42]: s.rjust(11,'A')
Out[42]: 'AAStataClub'
In [43]: s.zfill(11)
Out[43]: '00StataClub'
In [44]: s.center(11,'A')
Out[44]: 'AStataClubA'
三、字符串方法之“删除”
lstrip:删除左端指定字符,默认情况为空格
rstrip:删除右端指定字符,默认情况为空格
strip:删除字符串左端和右端的指定字符,默认情况为空格
举例如下,我们使用默认情况来删除空格。
In [45]: s=' Stata Club '
In [46]: s.lstrip()
Out[46]: 'Stata Club '
In [47]: s.rstrip()
Out[47]: ' Stata Club'
In [48]: s.strip()
Out[48]: 'Stata Club'
对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!
往期推文推荐
Stata16新功能之“框架”——frlink连接多个数据集(3)
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。