一、索引
索引即下标,字符串中的每个字符都有其对应的索引,索引从0开始。我们可以通过索引定位到字符串中的某个字符。
name = "ark" # 每个字母都是一个元素
# 0 1 2 正序索引
# -3 -2 -1 逆序索引
a = name[1]
b = name[-3]
print("a:" + a)
print("b:" + b)
从左至右的索引从0开始,如第一个print输出的结果是a:r
。负数索引要从右至左,最左边是-1,如第二个print输出的结果是b:a
。
二、切片
切片是对字符串进行裁剪的操作,操作符是[]
,有以下几个特点:
1、顾头不顾尾 name[起始位置:终止位置]
也就是说它取的区间是左闭右开区间。
name = "today is good"
print("name[0:2] " + name[0:2])
由于是左闭右开区间,所以print输出的结果是name[0:2] to
。
2、某个位置不指定的时候默认取最后或最前
name = "today is good"
print("name[2:] " + name[2:])
print("name[:5] " + name[:5])
print("name[:] " + name[:])
第一个print会输出name[2:] day is good
,因为[]的第二个索引没有写,所以直接取到最后;
第二个print会输出name[:5] today
,因为[]的第一个索引没有写,所以直接从0取到5(不包含5);
第三个print会输出name[:] today is good
,当[]的两个索引值都没有写的时候,直接取整个字符串,相对于没有进行切片。
3、索引为负数的情况
name = "today is good"
print("name[1:-1] " + name[1:-1])
print("name[:-1] " + name[:-1])
print("name[-2:1] " + name[-2:1])
print("name[-2:-5] " + name[-2:-5])
print("name[-4:-2] " + name[-4:-2])
前面提到过,索引为负数时要从右往左,最右边的字符索引是-1,因此第一个print输出的结果应该是name[1:-1] oday is goo
,因为1就是从左往右的第二个字符(索引从0开始),而-1是从右往左的第一个字符;
第二个print的结果是name[:-1] today is goo
,和上面一样,只不过第一个位置的索引没有指定,索引直接从0开始;
第三个print的结果是name[-2:1]
,也就是为空,为什么会为空呢?因为字符串的切片必须是[]中的第一个位置的索引要比第二个位置的索引要小(位置上),现在第一个位置的索引是-2,对应倒数第二个字符o,而第二个位置的索引是1,对应第二个字符o,所以截取不到,返回空;
第四个print的结果是name[-2:-5]
,也是空,原理是上面一样;
第五个print的结果是name[-4:-2] go
,也就是从右往左数第4个截取到第2个(不包括第2个)。
4、三个参数的情况 name[起始位置:终止位置:步长]
步长意味着隔几个字符取一个,步长默认为1,当步长为负数时反着截取。
name = "today is good"
print("name[0:5:1] " + name[0:5:1])
print("name[0:5:2] " + name[0:5:2])
print("name[2:5:-1] " + name[2:5:-1])
print("name[-2:5:-1] " + name[-2:5:-1])
print("name[-2:-5:-1] " + name[-2:-5:-1])
第一个print的结果是name[0:5:1] today
,这里可能会觉得奇怪,步长为1不是应该隔一个字符取一个字符吗?为什么还是取到了完整的字符串呢?注意步长为n时,是隔n-1个字符取一个,默认是步长就是1,因此会连续截取;
第二个print的结果是name[0:5:2] tdy
,这次步长是2,也就是隔2-1=1个字符取一个。
第三个print的结果是name[2:5:-1]
,结果为空,这里明明符合我们上一条说的[]中的第一个位置的索引要比第二个位置的索引要小,为什么会截取为空呢?因为这里的步长是负数,当步长为负数时,这条规则就会反过来,也就是[]中的第一个位置的索引要比第二个位置的索引要大(位置上),否则将截取不到值;
第四个print的结果是name[-2:5:-1] oog si
,此时步长是-1,第一个位置的索引是-2,对应倒数第二个字符o,第二个位置的索引是5,对应第五个字符空格,符合第一个位置的索引要比第二个位置的索引要大,所以能够进行截取,步长为负数时是反着截取,也就是从索引为-2的位置开始截取到索引为5的位置(不包括5);
第五个print的结果是name[-2:-5:-1] oog
,原理同上。
5、切片的时候起始位置和终止位置都超出的时候不会进行报错
name = "today is good"
print("name[100:400] " + name[100:400])
print("name[1:600]" + name[1:600])
print("name[-100:5] " + name[-100:5])
第一个print,两边都超出了范围,不会报错,输出为空;
第二个print,右边超出范围,不会报错,从索引为1的位置截取到最后;
第三个print输出name[-100:5] today
,左边超出范围,不会报错,从索引为0的位置截取到5的位置(不包括5)。
下面是一些练习,可以先自己预测一下输出结果,再去运行一遍检查是否正确。
name = "你好,这里是绿洲。"
print("name[-6:6] " + name[-6:6])
print("name[::2] " + name[::2])
print("name[100:500] " + name[100:500])
print("name[1:500]" + name[1:500])
print("name[-100:5] " + name[-100:5])
name = "python is best"
print("获取name中后3个字符:" + name[-3:])
print("获取name中第1,3,5个字符:" + name[0:6:2])
print("获取name中第2,4,6个字符:" + name[1:7:2])
print("获取name中第4个到最后一个,每2个取一个:" + name[3::2])
print("获取name中倒数第5个到最开始,每3个取一个:" + name[-5::-3])
三、大小写转换
python的大小写转换主要涉及两个函数:upper()和lower():
upper():将字符串中的字母全部转换成大写;
lower():将字符串中的字母全部转换成小写。
s = "ark"
s1 = s.upper()
print(s1)
s = "ARK"
s2 = s.lower()
print(s2)
四、以…开头或以…结尾
主要涉及到两个函数:startswith()和endswith():
startswith():判断字符串是否以某个字符串开头,返回一个布尔值;
endswith():判断字符串是否以某个字符串结尾,返回一个布尔值。
s = "alex"
s1 = s.startswith("e") # 是否以e开头,返回false
print("s1:" + str(s1))
s2 = s.startswith("e", 2) # 从下标为2的字符串开始,是否以e开头,返回true
print("s2:" + str(s2))
s1 = s.endswith("x") # 是否以x结尾,返回true
print("s1:" + str(s1))
s2 = s.endswith("e", 0, 2) # 下标为0~2的字符串中,是否以e结尾,返回false
print("s2:" + str(s2))
当带两个参数时,第二个参数代表从索引为2位置的字符开始的字符串去匹配。
当带三个参数时,第二个参数代表索引开始位置,第三个参数代表索引结束位置,注意这里也是左闭右开区间。
五、常用方法
1、maketrans()
用来生成字符映射表
translate()
用来根据映射表中定义的映射关系转换字符串并替换其中的字符
table = ''.maketrans('abcdefg', '1234567') # 两个字符串中的字符是一一对应的,不是两个字符串整体对应
s = 'ahhhbiiicoood'
2、strip()
删除字符串两边的空白字符/指定字符
rstrip()
删除字符串右边的空白字符/指定字符
lstrip()
删除字符串左边的空白字符/指定字符
s = ' a b c '
print(s.strip())
print(s.rstrip())
print(s.lstrip())
s = 'aaabbbaaacccaaa'
print(s.strip('a')) # 删除两端指定字符
print(s.rstrip('a'))
print(s.lstrip('a'))
s = 'abcdasdfwg'
print(s.strip('abce')) # 这三个方法的参数字符串不是作为整体来看待的,而是多个字符,只要两端出现了这个字符串中的字符就会被删掉
3、center() 、ljust()、rjust()
:返回指定宽度的新字符串,原字符串居中、左对齐或右对齐,如果指定宽度大于字符串长度,使用指定字符(默认空格)进行填充,如果指定宽度小于等于字符串长度,则返回原字符串。
s = '123123'
print(s.center(5))
print(s.center(20))
print(s.rjust(20, '='))
print(s.ljust(20, '.'))
4、对字符串内容的判断方法
isalnum()
判断字符串是否是数字或字母(全部是数字或字母才返回true)
isalpha()
判断字符串是否是字母(全部是字母才返回true)
isdigit()
判断字符串是否是数字(全部是数字才返回true)
isdecimal()
检查字符串是否只包含十进制字符。这种方法只存在于unicode对象。
isnumeric()
检测字符串是否只由数字组成。这种方法是只针对unicode对象。注:定义一个字符串为Unicode,只需要在字符串前添加 ‘u’ 前缀即可。
isspace()
判断字符串是否是空字符(全部是空字符才返回true)
isupper()
判断字符串是否是大写字母(全部是大写字母才返回true)
islower()
判断字符串是否是小写字母(全部是小写字母才返回true)