字符串
字符串的存储地址原理
在python中有一个字符串保留区,当中存放了声明的字符串,每一个字符串对应一个地址,变量名指向对应的地址, 只要字符串相同,声明内容相同的字符串变量,他都指向同一个地址。
'''
例:
s1 = 'hello'
s2 = s1
s3 = 'hello'
s4 = 'hello1'
---> 其中 s1、s2、s3 这三个变量的地址都相同
----> 具体解释: s2 = s1 的实质就是将 s1的地址赋给s2
s3 = 'hello' 因为在字符串保留区中已经存在了 hello 这个字符串,所以为了节省内存,就直接使用原来字符串的地址。
s4 = 'hello1' 这个字符串因为还未出现在字符串保留区,所以它会有一个自己的地址,而不是用’老地址‘
'''
#代码
s1 = 'hello'
s2 = s1
s3 = 'hello'
s4 = 'hello1'
print(id(s1))
print(id(s2))
print(id(s3))
print(id(s4))
字符串 截取
索引概念:index
一个字符串,每一个字符都对应了一个编号。
例: A B C D E F G H I
index: 0 1 2 3 4 5 6 7 8 --->这是其中一种编号方式从左自右,从0开始
index: -9 -8 -7 -6 -5 -4 -3 -2 -1 --->这是另一种编号方式从右自左,从-1开始
字符串索引机制
1、 0~len(s)-1 2、 -len(s)~ -1 虽然两种编号方式不同,但是在切片时,都是从左自右的书写,并且两种编号方式可以混合用
例:
#截取(结果为某一字符)
s1 = 'ABCDEFG'
print(s1[4]) ------> 结果:E
print(s1[0]) ------> 结果:A
print(s1[-1]) ------> 结果:G
切片(从长字符串得到一个小字符串)
print(s[1:4]) ------> 结果:BCD (规则:左闭右开,左取右不取)
print(s[0:5]) ------> 结果:ABCDE
print(s[:5]) ------> 结果:ABCDE (从0到index=4,包左不包右)
print(s[-3:-1]) ------> 结果:EF (还是先写左再写右)
print(s[-3:7]) ------> 结果:EFG (两种编号可以混合使用)
print(s[-3:]) ------> 结果:EFG (从-3开始到结尾)
print(s[:]) ------> 结果:ABCDEFG (相当于 print(s),且两个变量的地址一样)
x = s[:]
print(x)
print(s) --->结果相同
print(id(x))
print(id(s)) --->结果相同
格式变形:
字符串变量[start: end :step] 默认是一个一个取这个元素,加入步长后,每次取 当前位置+步长(step)
print(s[:-1:2]) ------> 结果:ACE
print(s[1::2]) ------> 结果: BDF
print(s[::4]) ------> 结果: AE
step:
1.步长
2.方向 step 正数 从左向右
step 负数 从右向左
print(s[::-1]) ------> 结果: GFEDCBA (默认从头开始,从右段开始,方向看步长的正负)
print(s[::]) ------> 结果: ABCDEFG (默认从头开始,从左段开始)
print(s[0:6:-2]) ------> 错误示范
原因:它从0开始,步数为负,方向向左,则无法到index=6
print(s[6:0:-2]) ------> 结果:GECA
字符串的常见操作
取长度-len
path = 'https: // www.bilibili.com / video / BV1R7411F7JV?spm_id_from = 333.999'
print(len(path)) # --->结果:71
查找内容-find,index,rfind,rindex
- find:从左向右查找,只要遇到一个符合要求的,则返回位置,如果没有找到符合要求的则返回-1
- rfind:right find。与find对应,从右向左查找,只要遇到一个符合要求的,则返回位置,如果没有找到符合要求的则返回-1
- index与find的区别:两种在操作上没有区别,但是index如果找不到会报错。
- rindex与index对应。
path = 'https: // www.bilibili.com / video / BV1R7411F7JV?spm_id_from = 333.999'
# 例-find
i = path.find('w')
j = path.find('m')
print(path[i:j + 1]) # --->结果:www.bilibili.com
# 除了单个字符的查找,字符串也可以
i = path.find('bilibili')
print(i) # 多个字符时它会返回字符串的第一个字符的位置
# --->结果:14
print(path[i:]) # --->结果:bilibili.com / video / BV1R7411F7JV?spm_id_from = 333.999
# 例-rfind
a = path.rfind('i')
print(path[a:]) # --->结果:id_from = 333.999
# 例-index
# b = path.index('$')
# print(b)
# rindex不做演示
判断:startswith,endswith,isalpha,isdigit,isalnum,isspace
- startswith:判断字符串开头与要求字符是否相同
- endswith:判断字符串结尾与要求是否相同
- is和has:两者开头的函数都是用于判断的,is表示是否相同;has表示是否存在。都返回布尔值
- isalpha:判断字符串是否都是字母
- isdigit:判断字符串是否都是数字
- isalnum:判断字符串是否含有字母和数字
- isspace:判断字符串是否只有空格
- isupper:判断字符串是否都是大写字母
- islower:判断字符串是否都是小写字母
统计字符串中的某字符的个数-count
path = 'https: // www.bilibili.com / video / BV1R7411F7JV?spm_id_from = 333.999'
print(path.count('b')) # --->结果:2
替换内容-replace
path = 'https: // www.bilibili.com / video / BV1R7411F7JV?spm_id_from = 333.999'
print(path.replace('bilibili', 'dilidili')) # replace('被替换内容',‘添加进去的内容’,个数),
切割字符串:split,rsplit,partition,rpartition
切割字符串之后,切割的内容都会被放在列表中。
- split:自左向右进行分割,遇到目标就进行分割,默认对所有目标前后进行分割。split分割会将分割符去掉,可以添加分割次数,1就分 一次。
- rsplit:自右向左进行分割,与split对应。
- splitlines:按行分割,也可以指定分割次数。
- partition:与split区别,会联通分割符分成三部分:分割符前,分割符,分割符后。
- rpartition:自右向左进行分割,与partition对应。
path = 'https: // www.bilibili.com / video / BV1R7411F7JV?spm_id_from = 333.999'
kuai = '''
aaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbb
cccccccccccccccccc
dddddddddddddddddd
'''
print(path.split('/', 1)) # --->结果:['https: ', '/ www.bilibili.com / video / BV1R7411F7JV?spm_id_from = 333.999']
print(path.rsplit('/', 1)) # --->结果:['https: // www.bilibili.com / video ', ' BV1R7411F7JV?spm_id_from = 333.999']
print(kuai.splitlines()) # --->结果:['', 'aaaaaaaaaaaaaaaaaa', 'bbbbbbbbbbbbbbbbbb', 'cccccccccccccccccc', 'dddddddddddddddddd']
print(path.partition('/')) # --->结果:('https: ', '/', '/ www.bilibili.com / video / BV1R7411F7JV?spm_id_from = 333.999')
print(
path.rpartition('/')) # --->结果:('https: // www.bilibili.com / video ', '/', ' BV1R7411F7JV?spm_id_from = 333.999')
修改大小写:capitalize,title,upper,lower
- capitalize:把字符串中的第一个首字母大写
- title:把每个单词的首字母大写
- upper:把每个字母都大写
- lower:把每个单词都小写
KPL = 'hello World'
print(KPL.capitalize()) # --->结果: Hello world
print(KPL.title()) # --->结果:Hello World
print(KPL.upper()) # --->结果: HELLO WORLD
print(KPL.lower()) # --->结果:hello world
空格处理:添空格:ljust,rjust,center;去空格:lstrip,rstrip,strip
- ljust:右对齐,把字符串放右边,添加的空格放左边
- rjust:左对齐,把字符串放左边,添加的空格放右边
- conter:剧中对齐,把字符串放自己,添加的空格分别放到两边
- lstrip:去左空格
- rstrip:去右空格
- strip:首尾都去空格
KK = 'wwwbilibili com'
print(KK.ljust(30))
print(KK.rjust(30))
KK = KK.center(30)
print(KK)
print(KK.lstrip())
print(KK.rstrip())
print(KK.strip())
字符串拼接:join(列表的拼接:['','','','','',''].join)
字符串格式化
- 用格式化符号进行格式化
- 用format格式化:分为数字格式化和关键字格式化
name = 'orange'
age = 18
# 格式化符号
print("my name is %s. I'm %d years odl" % (name, age))
#format格式化
print("my name is {}. I'm {} years odl".format(name, age))
print("my name is {0}. I'm {1} years odl.I want to eat {0}".format(name, age))
print("my name is {name}. I'm {age} years odl".format(name='orange', age=18))
#--->结果:my name is orange. I'm 18 years odl
#--->结果:my name is orange. I'm 18 years odl.I want to eat orange
标签:学习,python,---,print,字符串,path,------,id
From: https://blog.51cto.com/u_15954070/6052106