一:概述
Python中的字符串的一些概念
- 可以看作是字符的集合,在数据类型里没有单个字符的数据类型,可以用单个字符表示的一个字符串数据类型
- 字符串是一种不可变的序列类型,单个字符从左到右按照顺序排列,同时修改某个位置的字符是不被允许的
- 在Python3中,字符串可以分为三类,str用于Unicode文本,bytes用于二进制数据,bytearray是bytes的一种可变的变体
1.1 字符串的创建
通过单引号,双引号,三引号来创建一个字符串对象,本质上单引号和双引号及三引号的作用是一样的。
name1 = 'wangys' name2 = "wangys" name3 = '''wangys''' 使用单引号,双引号及三引号本质是一样的,都可以创建一个字符串对象
1.2 其他
也可以将不同的字串进行合并,字串之间使用空格,作用类似于 +号操作
name = 'wa' "ng" '''ys''' print(name)
# wangys
name = 'wa',"ng",'''ys''' # 如果之间使用逗号,会组成一个元祖
print(name)
('wa', 'ng', 'ys')
二: 基本操作
- 索引
- 分片
- 乘法
- 判断是否包含值
- 长度
- 最大值
- 最小值
2.1 字符串索引及切片
- 字符串时有序字符集合,可以通过位置(索引)找到相应的元素
- Python中字符的偏移量是左到右开始计数的,从0开始,到字符串长度-1,也可以通过负数取得,负数偏移量跟这个字符串的长度之和就是这个字符的正偏移量
- 表示方法是一对[]括号将偏移量写入即可得到该偏移量的字符
- 分片时使用冒号分隔,切片结果包括左边界,不包括右边界,即顾头不顾尾
- 分片时如果忽略了边界,左边界从0开始,右边界到字符串长度-1结束即到字符串的结尾并包括这个结尾
- 分片时如果指定了步进数,意思是每隔步进数取一个索引值
- 切片操作不仅仅对字符串有效,对元祖及列表也是一样的
- 如果索引过界,通过索引取值时会报错
2.1.1 索引
name = 'wangys'
print(name[0])
print(name[2])
print(name[-1])
print(name[-3])
# w
# n
# s
# g
2.1.2 分片(slice)
name = 'wangys'
# 没有定左右边界,则包括整个字符串 print(name[:]) # wangys
# 没有定左边界,则从0开始 print(name[:3]) # wan
# 如果没有定右边界,则到字符串的结尾 print(name[1:]) # angys
#左右都定了边界,顾首不顾尾
print(name[1:-1])
# angy
# 左右都定了边界,顾首不顾尾 print(name[1:3]) an
name = 'wangys'
# 步长默认情况
print(name[::1])
# 返回取整个字符串
print(name[::-1])
# 偏移量从1到5没隔2步取一个索引
print(name[1:5:2])
# 偏移量从5到1 每隔2步取一个索引
print(name[5:1:-2])
2.2 字符串拼接“+”
first_name = 'jack' second_name = 'john' name = first_name+' '+second_name print(name) # jack john
# 仅限字符串凭借,当使用数字类型时会报错
name = 'wangys'
age = 18
info = name+age
print(info)
# TypeError: must be str, not int
name = 'wangys'
age = '18'
info = name+age
print(info)
# wangys18
2.3 字符串多复制*
name = 'wangys' ret = name*3 print(ret)
# wangyswangyswangys
print('-'*8)
--------
2.4 计算字符串的长度
# 使用len函数计算字符串中字符的个数
name = 'wangys' print(len(name))
# 6
2.5 循环遍历整个元素
name = 'wangys' for i in name: print(i,end=' ') # w a n g y s
2.6 in操作
info = 'I love you' print('love' in info) print('you' not in info) # True # False
2.7 max min
- 按照ASCII计算最大和最小值
name = 'wangys' print(max(name)) print(min(name)) #y # a
三: 字符串常用的操作
3.1 center
- 将字符串居中显示
- 有两个参数,第一个参数是整个字符串的长度,第二个参数是填充字符串(长度为1)
name = 'wangys' print(name.center(30,'*')) # 长度30,不够使用*填充 # ************wangys************ name = 'wangys' print(name.center(30,'*#')) # 填充字符必须是长度为1的字符 # TypeError: The fill character must be exactly one character long name = 'wangys' print(name.center(30)) # 默认用空格填充 # wangys
3.2 strip
- strip 默认删除两边的空白,空白包括空格,制表符,换行符等.
- 插在中间的空格不会删掉,也可以制定删除的特殊符号,但还是哪个原则,插在中间的并不删除
- lstrip 删除左边
- rstrip 删除右边
name = input('请输入你的名字:') if name == 'wangys': print('你好啊')
name = input('请输入你的名字:').strip() if name == 'wangys': print('你好啊')
name = ' #wan#gys*' print(name.strip(' #*'))
name = ' wangys ' print(name.lstrip()) print(name.rstrip())
3.3 startswith/endswith
- 以什么为开头,以什么结尾
name = 'wangys' print(name.startswith('wa')) print(name.startswith('ng',2,5)) print(name.endswith('ys'))
应用:判断请求,以哪个字符串开始,或者结尾
name = 'wangys' if name.startswith('wa'): pass elif name.startswith('ll'): pass
import os files = os.listdir('.') # 找出已py文件结尾的文件 py_files = [file for file in files if file.endswith('.py')] print(py_files) # 找出以py或者以sh结尾的文件 多个条件过滤时使用元祖条件(必须是元祖) py_sh_files = [file for file in files if file.endswith(('.py', '.sh'))] print(py_sh_files)
3.4 find
- 找匹配得子字符串得索引
- 如果找到就将找到得第一个符合匹配得子字符串索引返回,如果找不到就返回-1
- 可以指定起始和结束位置进行查找
s = 'hello world'
print(s.find('world'))
# 6
# 找到了就不会再往后找了
s = 'hello world'
print(s.find('o'))
# 4
# 第二个参数表示从第7个字符开始查找
s = 'hello world'
print(s.find('o',6))
# 7
# 表示从7到10之间得字符查找
s = 'hello world'
print(s.find('o',7,10))
# 7
# 如果找不到就返回-1
s = 'hello world'
print(s.find('o',10,18))
# -1
# 用户输入大字符串,循环找出用户输入的字符串的位置
s = input('请输入大的字符串:') while True: subString = input('请输入要查询的子字符串:') if subString.lower() == 'end': break elif subString: start = 0 end = len(s) while True: startPostion = input('请输入开始查找的位置:') if startPostion == '': startPostion = start elif startPostion.isdigit(): startPostion = int(startPostion) break else: print('请输入数字') continue while True: stopPostion = input('请输入结束查找的位置:') if stopPostion == '': stopPostion = end elif stopPostion.isdigit(): stopPostion = int(stopPostion) break else: print('请输入数字') continue index = s.find(subString,startPostion,stopPostion) if index == -1: print('没找到') else: print("'{}' 在 '{}'出现的位置是{}".format(subString,s,s.find(subString,startPostion,stopPostion))) else: print('请不要输入空字符串')
3.5 index
- 找出子字符串的索引位置
- 如果找不到就报错
name = 'wangys' print(name.index('a')) print(name.index('angy')) print(name.index('lala')) # 1 # 1 # ValueError: substring not found
3.6 split
- 将字符串进行切割
- 于join方法互为逆方法,将字符串生成列表类型
- 默认以空格,制表符,换行符作为分隔符,也可以指定切割符
path = '/usr/local/nginx'
listPath = path.split('/')
print(listPath)
s = r'\'
windowsPath = s.join(listPath)
print('C:'+windowsPath)
# ['', 'usr', 'local', 'nginx']
# C:\usr\local\nginx
3.7 capitalize
- 首字母大写
name = 'wangyongsheng' name = name.capitalize() print(name)
# Wangyongsheng
不论字符串里是否有大写字母,都会将首字母大写,其他的都是小写
name = "WangYS" name = name.capitalize() print(name)
# Wangys
3.8 upper/lower
- 全部大写
name = 'wangys' name = name.upper() print(name)
- 全部小写
name = 'WangYongSheng' name = name.lower() print(name)
应用:比如说验证码校验,对用户输入不区分大小写
code_num = 'WangYs' input_num = input("请输入验证码,不区分大小写:") if code_num.lower() == input_num.lower(): print("输入正确") else: print("请重新输入")
3.9 swapcase
name = 'WangYs' name = name.swapcase() print(name)
3.10 title
将以空格或者其他特殊字符或者数字隔开的字符串首字母大写
name = 'wang yong sheng' name = name.title() print(name) name = 'wang*yong-sheng' name = name.title() print(name)
3.11 replace
- 字符串是不可变数据类型,所谓修改并不是在本身上做修改,而是生成了一个新的字符串。
- 可以使用replace进行修改
msg = 'wangys wangys' print(msg.replace('wangys','wc')) print(msg.replace('wangys','wc',1))
# wc wc
# wc wangys
3.12 count
1: 如果多个,就返回一个数
2:如果没有,返回0
3:可以切片后再进行计数
msg = 'My name is wangys' print(msg.count('a')) print(msg.count('x')) print(msg.count('wangys')) print(msg.count('a',2,5))
3.13 isdigit/isalnum/isalpha
- isdigit 判断字符串只有数字组成
- isalpha 判断字符串只有字母组成
- isalnum 判断字符串是否有数字和字母组成
msg = 'wangys123' print(msg.isalnum()) #字符串由字母或数字组成 print(msg.isalpha()) #字符串只由字母组成 print(msg.isdigit()) #字符串只由数字组成
四 :字符串格式化
4.1 %s %d
name = input("姓名:") age = int(input("年龄:")) height = int(input("身高:")) msg = ''' -------- Info of %s --------- 姓名:%s 年龄:%d岁 身高:%scm ''' % (name,name,age,height) print(msg)
4.2 {} 按照位置
name = input("姓名:") age = int(input("年龄:")) height = int(input("身高:")) msg = ''' -------- Info of {} --------- 姓名:{} 年龄:{}岁 身高:{}cm '''.format(name,name,age,height) print(msg)
4.3 {} 按照指定位置
name = input("姓名:")
age = int(input("年龄:"))
height = int(input("身高:"))
msg = '''
-------- Info of {1} ---------
姓名:{1}
年龄:{2}岁
身高:{3}cm
'''.format(name,name,age,height)
print(msg)
4.4 {} 按照关键字
name = input("姓名:") age = int(input("年龄:")) height = int(input("身高:")) msg = ''' -------- Info of {name} --------- 姓名:{name} 年龄:{age}岁 身高:{height}cm '''.format(name=name,age=age,height=height) print(msg)
五:其他操作
1: 利用int或者float进行类型转换
a = 1
b = '2'
print(a+b) # 字符串无法跟数字相加
TypeError: unsupported operand type(s) for +: 'int' and 'str' # 报错
a = 1
b = '2'
b = int(b) # 可以通过int()函数将字符串数字转换为数字,然后进行运算
print(a+b)
# 3
2: len函数
- 去字符串字符的长度
name='wangys' print(len(name))
遍历字符串
- 根据索引
name='wangys' count = 0 while count < len(name): print(name[count]) count +=1
- for 循环
for 变量 in 可迭代对象
name = 'wangys' for i in name: print(i)
3 join 方法
-
该方法用于连接序列中的方法
- 跟split方法正好相反
- join方法只能用于字符串类型,如果是其他数据类型,则会报错
list = ['1','2','3']
s = '+'
ret = s.join(list)
print(ret)
# 1+2+3
dir = ['','usr','local','nginx']
linux_s = '/'
linuxPath = linux_s.join(dir)
windows_s=r'\'
windowsPath = windows_s.join(dir)
print(linuxPath)
print('C:'+windowsPath)
# /usr/local/nginx
# C:\usr\local\nginx
list = [1,2,3,4,5]
s = '+'
print(s.join(list))
# TypeError: sequence item 0: expected str instance, int found