python中字符串是不可变对象,所以所有修改和生成字符串的操作的实现方法都是另一个内存片段中新生成一个字符串对象。例如,'abc'.upper()
将会在划分另一个内存片段,并将返回的ABC
保存在此内存中。
1. 大小写转换
(1)lower, upper
返回字符串的小写,大写格式(注意,这是新生成的字符串,在另一片内存片段中)
>>> print('ab XY'.lower())
ab xy
>>> print('ab XY'.upper())
AB XY
(2) title, capitalize
前者返回S字符串中所有单词首字母大写且其他字母小写的格式,后者返回首字母大写、其他字母全部小写的新字符串。
>>> print('ab XY'.title())
Ab Xy
>>> print('abc DE'.capitalize())
Abc de
(3) swapcase
对S中的所有字符串做大小写转换(大写-->小写,小写-->大写)
>>> print('abc XYZ'.swapcase())
ABC xyz
2. isXXXX判断
(1)判断是否是数字或字母
S.isdecimal()
S.isdigit() 是否是数字
S.isnumeric()
S.isalpha() 是否是字母
S.isalnum()
>>> print('34'.isdigit())
True
>>> print('abc'.isalpha())
True
>>> print('a34'.isalnum())
True
(2)判断大小写
S.islower()
S.isupper()
S.istitle()
判断是否小写、大写、首字母大写。要求S中至少要包含一个字符串字符,否则直接返回False。例如不能是纯数字。
>>> print('a34'.islower())
True
>>> print('AB'.isupper())
True
>>> print('Aa'.isupper())
False
>>> print('Aa Bc'.istitle())
True
>>> print('Aa_Bc'.istitle())
True
>>> print('Aa bc'.istitle())
False
>>> print('Aa_bc'.istitle())
False
# 下面的返回False,因为非首字母C不是小写
>>> print('Aa BC'.istitle())
False
3 子串搜索
(1) count
返回字符串S中子串sub出现的次数,可以指定从哪里开始计算(start)以及计算到哪里结束(end),索引从0开始计算,不包括end边界。
>>> print('xyabxyxy'.count('xy'))
3
# 次数2,因为从index=1算起,即从'y'开始查找,查找的范围为'yabxyxy'
>>> print('xyabxyxy'.count('xy',1))
2
# 次数1,因为不包括end,所以查找的范围为'yabxyx'
>>> print('xyabxyxy'.count('xy',1,7))
1
# 次数2,因为查找的范围为'yabxyxy'
>>> print('xyabxyxy'.count('xy',1,8))
2
(2)endswith和startswith
endswith()检查字符串S是否以suffix结尾,返回布尔值的True和False。suffix可以是一个元组(tuple)。可以指定起始start和结尾end的搜索边界。
>>> print('abcxyz'.endswith('xyz'))
True
# False,因为搜索范围为'yz'
>>> print('abcxyz'.endswith('xyz',4))
False
# False,因为搜索范围为'abcxy'
>>> print('abcxyz'.endswith('xyz',0,5))
False
>>> print('abcxyz'.endswith('xyz',0,6))
True
(3)find,rfind和index,rindex
find()搜索字符串S中是否包含子串sub,如果包含,则返回sub的索引位置,否则返回"-1"。可以指定起始start和结束end的搜索位置。
index()和find()一样,唯一不同点在于当找不到子串时,抛出ValueError错误。
rfind()则是返回搜索到的最右边子串的位置,如果只搜索到一个或没有搜索到子串,则和find()是等价的。
同理rindex()。
4 替换
(1) replace
将字符串中的子串old替换为new字符串,如果给定count,则表示只替换前count个old子串。如果S中搜索不到子串old,则无法替换,直接返回字符串S(不创建新字符串对象)。
>>> print('abcxyzoxy'.replace('xy','XY'))
abcXYzoXY
>>> print('abcxyzoxy'.replace('xy','XY',1))
abcXYzoxy
>>> print('abcxyzoxy'.replace('mn','XY',1))
abcxyzoxy
5 分割
(1) partition和rpartition
搜索字符串S中的子串sep,并从sep处对S进行分割,最后返回一个包含3元素的元组:sep左边的部分是元组的第一个元素,sep自身是元组的二个元素,sep右边是元组的第三个元素。
partition(sep)从左边第一个sep进行分割,rpartition(sep)从右边第一个sep进行分割。
# 只搜索到一个sep时,两者结果相同
>>> print('abcxyzopq'.partition('xy'))
('abc', 'xy', 'zopq')
>>> print('abcxyzopq'.rpartition('xy'))
('abc', 'xy', 'zopq')
# 搜索到多个sep时,分别从左第一个、右第一个sep分割
>>> print('abcxyzxyopq'.partition('xy'))
('abc', 'xy', 'zxyopq')
>>> print('abcxyzxyopq'.rpartition('xy'))
('abcxyz', 'xy', 'opq')
# 搜索不到sep
>>> print('abcxyzxyopq'.partition('xyc'))
('abcxyzxyopq', '', '')
>>> print('abcxyzxyopq'.rpartition('xyc'))
('', '', 'abcxyzxyopq')
(2) split、rsplit和splitlines
split()根据sep对S进行分割,maxsplit用于指定分割次数,如果不指定maxsplit或者给定值为"-1",则会从左向右搜索并且每遇到sep一次就分割直到搜索完字符串。如果不指定sep或者指定为None,则改变分割算法:以空格为分隔符,且将连续的空白压缩为一个空格。
rsplit()和split()是一样的,只不过是从右边向左边搜索。
splitlines()用来专门用来分割换行符。虽然它有点像split('\n')或split('\r\n'),但它们有些区别
# sep为单个字符时
>>> '1,2,3'.split(',')
['1', '2', '3']
>>> '1,2,3'.split(',',1)
['1', '2,3'] # 只分割了一次
>>> '1,2,,3'.split(',')
['1', '2', '', '3'] # 不会压缩连续的分隔符
>>> '<hello><><world>'.split('<')
['', 'hello>', '>', 'world>']
# sep为多个字符时
>>> '<hello><><world>'.split('<>')
['<hello>', '<world>']
# 不指定sep时
>>> '1 2 3'.split()
['1', '2', '3']
>>> '1 2 3'.split(maxsplit=1)
['1', '2 3']
>>> ' 1 2 3 '.split()
['1', '2', '3']
>>> ' 1 2 3 \n'.split()
['1', '2', '3']
# 显式指定sep为空格、制表符、换行符时
>>> ' 1 2 3 \n'.split(' ')
['', '1', '', '2', '', '3', '', '\n']
>>> ' 1 2 3 \n'.split('\t')
[' 1 2 3 \n']
>>> ' 1 2\n3 \n'.split('\n')
[' 1 2', '3 ', ''] # 注意列表的最后一项''
>>> ''.split('\n')
['']
6 join
S.join(iterable)
将可迭代对象(iterable)中的元素使用S连接起来。注意,iterable中必须全部是字符串类型,否则报错。
>>> L='python'
>>> '_'.join(L)
'p_y_t_h_o_n'
# 对于字典
>>> L3={'name':"malongshuai",'gender':'male','from':'China','age':18}
>>> '_'.join(L3)
'name_gender_from_age'
将join()时的元素连接符指定为空时,则会将可迭代对象的每个元素组成一个连接起来的字符串。有时候,这是很有用的。
>>> L=['a','b','c','d']
>>> ''.join(L)
'abcd'
7 修剪
S.strip([chars])
S.lstrip([chars])
S.rstrip([chars])
分别是移除左右两边、左边、右边的字符char。如果不指定chars或者指定为None,则默认移除空白(空格、制表符、换行符)。
(1) 移除单个字符或空白。
>>> ' spacious '.lstrip()
'spacious '
>>> ' spacious '.rstrip()
' spacious'
>>> 'spacious '.lstrip('s')
'pacious '
>>> 'spacious'.rstrip('s')
'spaciou'
(2)移除字符序列中的字符
>>> print('www.example.com'.lstrip('cmowz.'))
example.com
>>> print('wwwz.example.com'.lstrip('cmowz.'))
example.com
>>> print('wwaw.example.com'.lstrip('cmowz.'))
aw.example.com
>>> print('www.example.com'.strip('cmowz.'))
'example'