字符串切片和逆序问题
先来了解切片操作:
myStr = 'hello world'
print(myStr[0:3]) # 输出为hel
myStr[0:3] 0表示切片开始位置,3表示切到下标为3的位置就停止 但是不包含myStr[3]
然后我们在切片的时候,可以传入第三个参数来表示每次切片的间隔,
myStr = 'abcdefg'
print(myStr[0:4:1]) # abcd 等价于myStr[0:4]
print(myStr[0:4:2]) # ac
第三个参数代表每次取到字符之后,间隔指定值之后再去取下一个字符,不传的话,默认就是为1。
此外,第三个参数,如果为正,那么代表从下标0开始取,往后取到下标为-1的字符(即字符串最后一项),**如果为负,代表从后往前取,即从下标-1到下标0这个方向开始切片,来看个例子
myStr = 'abcdefg'
print(myStr[0:4:1]) # abcd
print(myStr[0:4:-1]) # 输出为空
print(myStr[4:0:-1]) # ebcd
来分析myStr[0:4:-1]为何是空,指定第三个参数为-1之后,是从右往左开始取的,开始下标为4,截止下标为0,那么自然就取不到字符了,需要修改起始位置和截止位置。
那么现在我们得到了一个逆序的字符串,值得注意的是,输出的是:ebcd
,因为我们截止的下标是0,那么切片就取不到第一个值,我们需要修改一下截止的下标。
有了上述知识,我们就可以实现字符的逆序操作:
myStr = 'abcdefg'
print(myStr[-1:0:-1]) # gfedcb
# 截止下标为0,所以取不到myStr[0],需要修改为:
print(myStr[-1::-1]) # gfedcba
# 删掉指定的截止下标之后,切片就会一直截取到整个字符串结束,我们就实现了逆序的操作
# 那么有了上面的思路,我们想到,其实开始的下标也是可以省略的,只要指定了截取的方向(即第三个参数)
print(myStr[::]) # abcdefg 等价于myStr[::1]
print(myStr[::-1]) # gfedcba
字符串常用api:
介绍一些Python中常用的操作字符串的api
- find 检测str是否包含在myStr中,如果包含返回开始的下标,不包含返回-1
myStr = 'Hello'
print(myStr.find('He')) # 0
print(myStr.find('llo')) # 2
print(mtStr.find('none')) # -1
find()
默认是从左边开始查找,想从右边开始查找的话,可以使用rfind()
相似的api还有index()
以及rindex()
,不同的是,index如果没找到指定字符串的话会直接产生异常。
- count 返回str在指定start和end之间出现了多少次
myStr = 'Hello world world'
print(myStr.count('world')) # 2
print(myStr.count('world',0,5)) # 0
- replace 把myStr中的str1替换成str2,如果count 指定,则替换不超过count次
myStr = 'hello world world'
print(myStr.replace('world','WORLD')) # hello WOLRD WORLD
print(myStr) # hello world world 原字符串并不会改变
print(myStr.replace('world','WORLD',1)) # hello WORLD world 指定count
- split 以str作为分隔符切片myStr,如果maxSplit有指定值,那就切成指定值个切片
myStr = 'hello world world'
print(myStr.split(' ')) # 按照空格切割 ['hello','world','world']
print(myStr) # hello world world
print(myStr.split(' ', 1)) # ['hello', 'world world']
关于split
,直接写str.split()
的话,意味着程序会自动按照空格,\t等分隔符来智能分割字符串
myStr = 'abc dag \t dahj afh \t'
print(myStr.split()) # ['abc', 'dag', 'dahj', 'afh']
- capitalize 和 title
myStr = 'hello world world'
print(myStr.capitalize()) # Hello world world
print(myStr.title()) # Hello World World
print(myStr) # hello world world
- startswith/endswith 检查字符串是否已obj开头/结尾,是返回True,否返回False
myStr = 'hello world world'
print(myStr.startswith('hello')) # True
print(myStr.startswith('world')) # False
print(myStr.endswith('world')) # True
- lower/upper 转换为小写/大写
myStr = 'Hello World World'
print(myStr.lower()) # hello world world
print(myStr.upper()) # HELLO WORLD WORLD
print(myStr) # Hello World World
- ljust/rjust/center 返回一个字符串左对齐/右对齐/居中,并使用空格填充至长度width的新字符串
myStr = 'hello world'
print(myStr.ljust(20)) # 'hello world '
print( len(myStr.ljust(20)) ) # 20 长度已经改变
print(myStr.rjust(20)) # ' hello world'
print(myStr.center(20)) # ' hello world '
print(myStr) # 原字符串不改变
- lstrip/rstrip 删除字符串左边/右边的空白字符 strip 删除两端的空白字符
myStr1 = ' hello world'
print(myStr1.lstrip()) # hello world
myStr2 = 'hello world '
print(myStr2.rstrip()) # hello world
myStr3 = ' hello world '
print(myStr3.strip()) # hello world
- partition/rpartition 将myStr分为三部分,str前,str,以及str后
myStr = 'hello world world'
print(myStr.partition('world')) # ('hello ', 'world', ' world')
print(myStr.rpartition('world')) # ('hello world ', 'world', '')
- splitlines 按照行分隔,返回一个包含各行作为元素的列表
myStr = 'hello\nworld'
print(myStr.splitlines()) # ['hello', 'world']
- isaplha/isdigit/isalnum 所有字符都是字母/数字/数字或者字母
str1 = '1'
print(str1.isalpha()) # False 所有字符都是字母
print(str1.isdigit()) # True 所有字符都是数字
print(str1.isalnum()) # True 所有字符都是数字或者字母
str2 = '123hello'
print(str2.isalpha()) # False
print(str2.isdigit()) # False
print(str2.isalnum()) # True
- islower/isupper/istitle/isspace 所有字符都是小写/大写/单词首字母大写/空白字符
print('hello'.islower()) # True
print('HELLO'.isupper()) # True
print('Hello'.istitle()) # True
print(''.isspace()) # False
print(' '.isspace()) # True
- join myStr中每个字符后面加入str,构造出一个新的字符串
li = ['start','learning','Python']
str1 = ' '
print(str1.join(li)) # start learning Python
str2 = '_'
print(str2.join(li)) # start_learning_Python