字符串:单引号、双引号、三个单引号、三个双引号
字符串属于不可变的数据类型,一旦被定义,内存地址不变
name = '张三' # 字符串赋值给name后,内存地址存储张三,地址不变
username = '张三' # 张三去内存中找,username指向内存地址与name的地址一致
print(name is username) # True
name = '李四' # 修改name的值为李四,二者地址不同
print(name is username) # False
每个字符串在 python 中,都有两个索引值(下标)
1.从左到右:索引值从 0 开始,依次递增, 0 1 2 3 4 5 6 7 8 9
2.从右到左:索引值从 -1 开始,依次递减,-10 -9 -8 -7 -6 -5 -4 -3 -2 -1
字符串的运算:
+ 连接字符
* 连续输出多次字符串
str1 = 'a'
str2 = 'b'
print(str1 * 2 + str2 * 2) # aabb
len(字符串) 获取字符串长度
str1 = 'aabb'
print(len(str1)) # 4
字符串的索引:通过在字符串后面添加一对中括号和索引值,查找指定位置的字符
格式:字符串[索引值]
# 01234
str1 = 'a bcd'
# -5...-1
print(str1[0], str1[2], str1[-1]) # a b d
字符串的切片:截取一段字符
格式:字符串[起始位置: 结束位置: 步长]
切片至少有一个冒号,默认从左到右,截取的范围左闭右开(左边包含,右边不包含)
步长默认为 1,起始默认为 0,结束默认 len
步长为负数,从右边开始截取
# 012345678910
str1 = 'I love you.'
# 字符串切片至少一个冒号,默认步长为1
print(str1[:], str1[::]) # I love you. I love you.
# 左闭右开,包含2,不包含8,从下标2开始,到下标7结束
print(str1[2:8]) # love y
# 步长正数,每隔1位2位3位截取一个
print(str1[::1], str1[::2], str1[::3]) # I love you. Ilv o. Io u
# 步长负数,从右截取
print(str1[::-1]) # .uoy evol I
print(str1[::-2], str1[::-3]) # .o vlI .yv
字符串相关函数:
find:查找指定字符出现的索引值,返回索引值
格式:'字符串'.find('子字符', '起始位置', '结束位置')
# 012345678910
str1 = 'I love you.'
# '字符串'.find('子字符', '起始位置', '结束位置')
print(str1.find('o'), str1.find('e', 2, 9)) # 3 5
点进 find 查看详细信息
sub 子字符、start 起始位置、end 结束位置
如果范围内没有查找的内容,返回 -1
def find(self, sub, start=None, end=None): # real signature unknown; restored from __doc__
"""
S.find(sub[, start[, end]]) -> int
Return the lowest index in S where substring sub is found,
such that sub is contained within S[start:end]. Optional
arguments start and end are interpreted as in slice notation.
Return -1 on failure.
"""
return 0
同理,rfind 从右边查找
find 与 index 的区别:
find 找不到字符会返回 -1,index 找不到字符报错
split:指定分隔符分隔原字符串,返回列表 [ ],默认分隔符为空格
格式:'字符串'.split('分隔符', 最大分隔的次数)
str1 = 'I love you.'
# '字符串'.split('分隔符',最大分隔次数) 返回列表[]
print(str1.split()) # ['I', 'love', 'you.']
print(str1.split(' ', 1)) # ['I', 'love you.'] 分隔一次
print(str1.split('o')) # ['I l', 've y', 'u.'] 以o为分隔符
可以看到 split 方法中,sep 表示分隔符,maxsplit 表示最大分隔的次数
splitline 按换行符进行分隔:\n \r \n\r
expandtabs(空格数) 按制表符 \t 进行分隔,默认 8 个空格
# expandtabs(空格数) 按制表符 \t 进行分隔,默认8个空格
print('1\t2\t3\t4'.expandtabs()) # 1 2 3 4
print('1\t2\t3\t4'.expandtabs(4)) # 1 2 3 4
rpartition 从右边开始分隔,分隔为 3 个元素的元组(分隔符之前的部分,分隔符,分隔符之后的部分)可用于文件
# rpartition 从右边开始分隔,(分隔符之前的部分,分隔符,分隔符之后的部分)
print('www.baidu.com'.rpartition('.')) # ('www.baidu', '.', 'com')
print('www.baidu.com'.rpartition(',')) # ('', '', 'www.baidu.com')
replace 替换字符,返回替换后的字符串
格式:字符串.replace('旧字符', '新字符', '替换次数')
# 字符串.replace('旧字符', '新字符', '替换次数')
str1 = 'www.baidu.com'
str2 = 'aaaaaaaaaaaaaa'
print(str1.replace('.', '-')) # www-baidu-com
print(str2.replace('a', 'b', 2)) # bbaaaaaaaaaaaa
strip:去除字符串两边指定的字符,默认去除空格
格式:字符串.strip('指定字符')
如果指定的字符串为多个字符,逐个去除,直到出现不同的停止
''' strip 去除字符串两边指定的字符,默认去除空格
格式:字符串.strip('指定字符') '''
str1 = ' www.baidu.com '
print(str1.strip()) # www.baidu.com
print(str1.strip('w .bm')) # aidu.co
(这里尝试了下去除中间的任意字符,但没法去除,只有字符串两边的才行,
而且原字符串有两个点只去除了前面,因为 w 和空格都去除了,前面的点成了字符串的头,
后面是完整的字符串 baidu.com 所以无法再去除点)
同理,rstrip 表示从右边去除,lstrip 表示从左边去除
print(str1.rstrip()) # www.baidu.com
print(str1.lstrip()) # www.baidu.com
join:指定连接符连接字符串的字符
格式:'连接符'.join('可迭代对象')
''' join 指定连接符连接字符串的字符
格式:'连接符'.join('可迭代对象') '''
print('-'.join('1234')) # 1-2-3-4
print('abcd'.join('1234')) # 1abcd2abcd3abcd4
print('+'.join(['a', 'b', 'c'])) # a+b+c
元组 () 和列表 [ ] 稳定,集合 { } 不稳定,会将字符串重新排序
encode 字符串编码、decode 字符串解码
编码和解码的字符集必须相同
str1 = 'a咩c'
# encode 编码
print(str1.encode(encoding='utf-8')) # b'a\xe5\x92\xa9c' b开头表示字节,utf-8汉字3个字节
print(str1.encode(encoding='gbk')) # b'a\xdf\xe3c' b开头表示字节,gbk汉字2个字节
# decode 解码
print(b'a\xe5\x92\xa9c'.decode(encoding='utf-8')) # a咩c
count 统计子字符在原字符串中出现的次数,不存在则返回 0
格式:字符串.count('子字符', 起始位置, 结束位置)
''' count 统计子字符在原字符串中出现的次数
格式:字符串.count('子字符', 起始位置, 结束位置) '''
# 0123456789
str1 = 'abbcccdddd'
print(str1.count('d', 5)) # 4 从下标5开始
点进 count 查看详细信息
def count(self, sub, start=None, end=None): # real signature unknown; restored from __doc__
"""
S.count(sub[, start[, end]]) -> int
Return the number of non-overlapping occurrences of substring sub in
string S[start:end]. Optional arguments start and end are
interpreted as in slice notation.
"""
return 0
可以看到 count 函数中,sub 表示子字符,start 和 end 表示起始和结束位置
字符串大小写转换:
常用的有 upper(全部转大写)、lower(全部转小写)、title(单词首字母大写)、swapcase(大小写互换)、
capitalize(字符首字母大写)、casefold(转小写,会对特殊语言进行标准化处理,国际化)
str1 = 'wWW.bAidU.COm'
# upper 转大写
print(str1.upper()) # WWW.BAIDU.COM
# lower 转小写
print(str1.lower()) # www.baidu.com
# title 单词首字母大写
print(str1.title()) # Www.Baidu.Com
# swapcase 大小写互换
print(str1.swapcase()) # Www.BaIDu.coM
# capitalize 字符首字母大写
print(str1.capitalize()) # Www.baidu.com
# casefold 转小写,国际化
print(str1.casefold()) # www.baidu.com
字符串对齐方式:
center 居中、ljust 左对齐、rjust 右对齐、zfill 零补位
以 center 为例,width 表示字符串的总宽度,fillchar 表示填充字符
其他原理一致
str1 = 'a b c'
# center 居中
print(str1.center(10, '*')) # **a b c***
# ljust 左对齐
print(str1.ljust(10, '.')) # a b c.....
# rjust 右对齐
print(str1.rjust(10, '+')) # +++++a b c
# zfill 零补位
print(str1.zfill(10)) # 00000a b c
is 开头的函数通常是用来做一些判断:
比如 isdecimal(是否是数字)、isdigit(是否是数字,包含字节 b 开头)、isnumeric(是否是数字,包含汉字和数字)、
isalpha(是否是字母)、isupper(是否大写)、islower(是否小写)、isalnum(是否字母和数字)、
isascil(是否是 ascil 码)、isidentifier(是否是标识符)等
format 字符串格式化输出:
格式:字符串.format(*args, **kwargs)
*args 和 **kwargs 都是 python 中的可变参数
*args 允许函数接受任意数量的位置参数,这些参数会以元组的形式传入函数内部
**kwargs 允许函数接受任意数量的关键字参数,这些参数会以字典的形式传入函数内部
''' format 字符串格式化输出
格式:字符串.format(*args, **kwargs) '''
# 按位置传参,顺序取值
print('{},{}'.format('abc', '123')) # abc,123
# 按关键字传参,与顺序无关
print('{k},{v}'.format(v='abc', k=123)) # 123,abc
import string 模块:
使用方法:直接 string 后面加点
# Some strings for ctype-style character classification
whitespace = ' \t\n\r\v\f'
ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz'
ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
ascii_letters = ascii_lowercase + ascii_uppercase
digits = '0123456789'
hexdigits = digits + 'abcdef' + 'ABCDEF'
octdigits = '01234567'
punctuation = r"""!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~"""
printable = digits + ascii_letters + punctuation + whitespace