字符串的声明
字符串就是一系列的字符,在python中使用 单引号或者双引号 括起来的就是字符串:
# 使用单引号定义字符串
name1 = '张三'
print(type(name1)) #
# 使用双引号定义的字符串
name2 = "李四"
print(type(name2)) #
如果字符串中包含单引号或者双引号需要注意:
- 如果字符串中包含单引号,那么就需要使用双引号声明字符串
- 如果字符串中包含双引号,那么就需要使用单引号声明字符串
# 包含单引号的字符串
message1 = "This's Python"
print(message1) # This's Python
# 包含双引号的字符串
message2 = 'Say "Hello World"'
print(message2) # Say "Hello World"
除此之外还可以通过反斜杠转义符来实现:
# 包含单引号的字符串
print('I can\'t swim')
# 包含双引号的字符串
print("say \"Hello World\"")
在python中还可以使用 多引号 来声明字符串,使用多引号声明的字符串可以换行:
# 多行字符串
message = '''
第一行字符串
第二行字符串
第三行字符串
'''
print(message)
# 第一行字符串
# 第二行字符串
# 第三行字符串
使用单引号或双引号同样可以实现字符串的换行效果,但是需要借助转义符来实现:
# 通过转义符来实现字符串换行
message = "第一行\n第二行\n第三行"
print(message)
# 第一行
# 第二行
# 第三行
字符串还提供了 str() 方法,该方法可以将任意类型的数据转换成字符串类型:
# 数字转换成字符串
print(type(str(10))) #
# 列表转换成字符串
print(type(str([1, 2, 3]))) #
# 字典转换成字符串
print(type(str({"name": "jason", "age": 18}))) #
# 元祖转换成字符串
print(type(str((1, 2, 3)))) #
# 集合转换成字符串
print(type(str({1, 2, 3, 4}))) #
字符串的运算
字符串可以进行 相加 和 相乘 运算:
- 相加其实就是简单的字符串拼接
- 相乘就相当于将字符串相加了n次
# 字符串的相加运算
name = "张三"
age = '18'
print(name + "今年" + age + "岁") # 张三今年18岁
# 字符串的相乘运算
print(name * 3) # 张三张三张三
注意: 虽然可以使用相加的方式拼接字符串,但是该方法效率很低,所以不建议使用。
访问字符串
按照索引访问
可以使用 变量名 [索引值 ] 的方式读取字符串中的字符:
- 当索引值是正数的时候表示正向取值(从左向右)
- 当索引值是负数的时候表示反向取值(从右向左)
# 声明一个字符串
message = "Hello Wolrd"
# 正向取值
print(message[1]) # e
# 反向取值
print(message[-1]) # d
字符串的 索引是从0开始的 ,如果 索引值超出了字符串范围就会报错 :
# 声明一个字符串
message = "Hello Wolrd"
# 超出索引的范围就会报错
print(message[11])
# IndexError: string index out of range
该方法只能按照索引取值,而 不能更改值 :
# 声明一个字符串
message = "Hello Wolrd"
# 使用索引的方式修改值会报错
message[1] = 'H'
# TypeError: 'str' object does not support item assignment
遍历字符串
可以使用for循环遍历字符串:
# for循环遍历字符串
for c in "Hello World":
print(c,end="-")
# H-e-l-l-o- -W-o-r-l-d-
切片
通过切片可以 获取指定范围的子字符串 ,它的基本语法如下: 变量名 [ 开始位置 : 结束位置 ] ,它会返回从开始位置到结束位置的子字符串( 包含开始位置,不包含结束位置 ):
# 声明一个字符串
message = "Hello Wolrd"
# 获取Hello
# H的索引是0 , o的索引是4
# 所以切片是从0 - 5
print(message[0: 5]) # Hello
可以省略开始位置和结束位置:
- 省略开始位置表示从0开始
- 省略结束位置表示一直取到最后
- 同时省略开始和结束位置表示整个字符串的副本
# 声明一个字符串
message = "Hello Wolrd"
# 省略开始位置,表示从0开始
print(message[: 5]) # Hello
# 省略结束位置,表示一直取到最后
print(message[6:]) # Wolrd
# 同时省略表示取整个字符串
print(message[:]) # Hello Wolrd
注意: 冒号是不可以被省略的。
开始位置和结束位置的索引可以为负数,表示从右向左开始索引:
# 声明一个字符串
message = "12345678"
# 从右向左数第6个数到从右向左数第4个数之间
print(message[-6:-4]) # 34
使用切片时还可以传入第三个参数,用来表示步长:
# 声明一个字符串
message = "12345678"
# 设置步长
print(message[::2]) # 1357
步长也可以为负数,当步长为负数的时候表示从右向左取值:
# 声明一个字符串
message = "12345678"
# 步长为负数的时候表示从右向左取值
# 下面的代码是用来反转字符串
print(message[::-1]) # 87654321
成员运算符
成员运算符用来判断一个字符串是否是另外一个字符串的子字符串:
- a in b: b是不是包含a
- a not in b: b是不是不包含a
# 声明字符串
message = "hello"
# msg2 是否包含 msg1
print("ell" in message) # True
# msg2 是否不包含 msg1
print('ell' not in message) # False
格式化字符串
修改字符串的大小写
- title():以首字母大写的方式显示每个单词
- upper():将字符串改为全部大写
- lower():将字符串改为全部小写
- capitalize():首个单词的首字母大写
- swapcase():大小写翻转
message = "stephen Curry"
# 首字母大写
print(message.title()) # Stephen Curry
# 全部大写
print(message.upper()) # STEPHEN CURRY
# 全部小写
print(message.lower()) # stephen curry
# 首字母大写
print(message.capitalize()) # Stephen curry
# 反转大小写
print(message.swapcase()) # STEPHEN cURRY
# 原来字符串不会被修改
print(message) # stephen Curry
注意:这些方法会返回修改后的新字符串, 不会改变原来的字符串 。
f 字符串方法
要在字符串中插入变量的值,可以 在前引号前加上字母 f,再将要插入的变量放在花括号内 ,当Python显示字符串的时候会将每个变量都替换为其值:
# f-string的方法格式化字符串
name = "张三"
age = 12
print(f"{name}今年{age}岁了") # 张三今年12岁了
注意: 该方法是Python3.6引入的。
format方法
f 字符串是Python3.6才引入的,在此版本之前可以使用字符串的内置方法format代替:
age = 18
# My name is Tom, I'm 18 years old.
print("My name is {name}, I'm {age} years old.".format(name="Tom",age=age))
format括号内在传参数时完全可以打乱顺序:
age = 18
# My name is Tom Tom, I'm 18 years old.
print("My name is {name} {name}, I'm {age} years old.".format(name="Tom",age=age))
如果 {} 中没有传入key值,那么传入的值会按照位置与 {} 一一对应 :
age = 18
# My name is Tom, I'm 18 years old.
print("My name is {}, I'm {} years old.".format("Tom",age))
也可以把format传入的多个值当作一个列表,然后用 {索引} 取值 :
# my name is Tom, my age is 18!
print('my name is {0}, my age is {1}!'.format('Tom', 18))
# my name is Tom, my age is 18!
print('my name is {1}, my age is {0}!'.format(18, 'Tom'))
删除空白
在程序中额外的空白可能会令人迷惑,比如 'python' 和 ' python ' 看起来几乎没有什么两样,但是对于程序来说它们是两个不同的字符串,在进行字符串比较的时候就会产生迷惑。Python提供了下面的方法来去除字符串首尾的空白:
- rstrip:去除字符串末尾的空白
- lstrip:去除字符串开头的空白
- strip:去除字符串两边的空白
# 声明一个变量
name = " 中间的字符 "
print("开头的字符" + name + "结尾的字符") # 开头的字符 中间的字符 结尾的字符
# 去除开头的空白
print("开头的字符" + name.lstrip() + "结尾的字符") # 开头的字符中间的字符 结尾的字符
# 去除末尾的空白
print("开头的字符" + name.rstrip() + "结尾的字符") # 开头的字符 中间的字符结尾的字符
# 去除两边的空白
print("开头的字符" + name.strip() + "结尾的字符") # 开头的字符中间的字符结尾的字符
注意: 这三个方法都不会修改原来的字符串,而是将去除空白的字符串作为新的字符串返回。
可以在方法中传入参数,用来删除首尾指定的字符:
# 声明字符串
message = "****Hello*****"
# 删除开头的*
print(message.lstrip('*')) # Hello*****
# 删除结尾的*
print(message.rstrip('*')) # ****Hello
# 删除两端的*
print(message.strip('*')) # Hello
字符串对齐方法
- center:字符串居中显示,不够的填充
- ljust:字符串左对齐显示,不够的填充
- rjust:字符串右对齐显示,不够的填充
- zfill:字符串右对齐显示,不够用0填充
print("Tom".center(30, "-")) # -------------Tom--------------
print("Tom".ljust(30, "-")) # Tom---------------------------
print("Tom".rjust(30, "-")) # ---------------------------Tom
print("Tom".zfill(30)) # 000000000000000000000000000Tom
expandtabs方法
该方法用来 修改 \t (制表符)代表的空格数 :
print("Hello\tWorld") # Hello World
print("Hello\tWorld".expandtabs(1)) # Hello World
组织字符串
获取字符串长度
可以通过 len() 方法 获取字符串的长度:
# 声明一个字符串
message = "Hello Wolrd"
# len获取字符串的长度
print(len(message)) # 11
分隔字符串
可以使用 split方法 分割字符串,默认情况下是使用空格分割字符串,返回的是一个列表:
# 声明字符串
message = "Hello World"
print(message.split()) # ['Hello', 'World']
也可以传入参数指定分隔字符,按照括号内指定的字符切割字符串:
# 声明字符串
message = "192.168.1.1"
print(message.split('.')) # ['192', '168', '1', '1']
还可以传入第二个参数,指定分割的次数:
ip = "192.168.1.1"
# ['192', '168', '1.1']
print(ip.split(".", 2))
python还提供了 rsplit()方法 ,该方法刚好与split相反,从右往左切割,其它使用方法和split类似:
# 默认是用空白字符
print("Hello World".rsplit()) # ['Hello', 'World']
# 第一个参数指定分隔符
print("192.168.1.1".rsplit(".")) # ['192', '168', '1', '1']
# 第二个参数指定分隔次数
print("192.168.1.1".rsplit(".", 2)) # ['192.168', '1', '1']
join方法
该方法从可迭代对象中取出多个字符串,然后按照指定的分隔符进行拼接,拼接的结果为字符串:
# 从字符串中取出多个字符串,然后进行拼接
print(",".join("123456")) # 1,2,3,4,5,6
# 从列表中取出多个字符串,然后进行拼接
print(".".join(["192", "168", "2", "1"])) # 192.168.2.1
replace方法
该方法用新的字符替换字符串中旧的字符,语法: replace( '旧内容 ' , '新内容 ' ) :
# 替换字符
print("Hello Python".replace("Python", "World"))
# Hello World
可以使用第三个方法指定修改的个数:
# 指定替换次数
# Hello PP, I love Python
print("Hello Python, I love Python".replace("Python", "PP", 1))
分析字符串
startswith和endswith
- startswith(): 判断字符串是否以括号内指定的字符开头,结果为布尔值True或False
- endswith(): 判断字符串是否以括号内指定的字符结尾,结果为布尔值True或False
# 声明字符串
message = "Hello World"
# 是否以指定字符串开头
print(message.startswith("He")) # True
# 是否以指定字符串结尾
print(message.endswith("dd")) # False
isXXX判断方法
- isdigit、isdecimal、isnumeric: 判断字符串是否是纯数字组成,返回结果为True或False
- isdigit: 可以识别bytes和unicode类型
- isdecimal: 可以用来判断uncicode类型(bytes类型无isdecimal方法)
- isnumberic: 可以用来判断unicode、中文数字和罗马数字(bytes类型无isnumberic方法)
num1 = b'4' #bytes
num2 = u'4' #unicode,python3中无需加u就是unicode
num3 = '四' #中文数字
num4 = 'Ⅳ' #罗马数字
# True True False False
print(num1.isdigit(), num2.isdigit(), num3.isdigit(), num4.isdigit())
# True False False
print(num2.isdecimal(), num3.isdecimal(), num4.isdecimal())
# True True True
print(num2.isnumeric(), num3.isnumeric(), num4.isnumeric())
三者都不能用来判断浮点数:
num1 = '4.3'
# False False False
print(num1.isdigit(), num1.isdecimal(), num1.isnumeric())
- isalnum(): 字符串中既可以包含数字也可以包含字母
- isalpha(): 字符串中只包含字母
- isidentifier(): 判断字符串是不是合法的变量名
- islower(): 字符串是否是纯小写
- isupper(): 字符串是否是纯大写
- isspace(): 字符串是否全是空格
- istitle(): 字符串中的单词首字母是否都是大写
name = 'tony123'
print(name.isalnum()) # True
print(name.isalpha()) # False
print(name.isidentifier()) # True
print(name.islower()) # True
print(name.isupper()) # False
print(name.isspace()) # False
print(name.istitle()) # False
查找字符串
find和rfind
- find: 从指定范围内查找子字符串的起始索引,找得到则返回起始索引值,找不到则返回-1(可以指定查找位置)
- rfind: 同find,从右向左查找
'''
find的使用方法
'''
# 找到则返回索引
print("12345".find("34")) # 2
# 找不到返回-1
print("12345".find("9")) # -1
# 指定查找范围
print("12345".find("3", 0, 2)) # -1
'''
rfind的使用方法
'''
# 找到则返回索引
print("12345".rfind("4")) # 3
# 找不到返回-1
print("12345".rfind("9")) # -1
# 指定查找范围
print("12345".rfind("3", 0, 2)) # -1
index和rindex
- index: 同find,但在找不到时会报错
- rindex: 同index,从右向左查找
'''
index的使用
'''
# 找到返回索引
print("12345".index("4")) # 3
# 指定查找范围
print("12345".index("3", 0, 3)) # 2
# 找不到报错
# print("12345".index("9"))
'''
rindex的使用
'''
# 找到返回索引
print("12345".rindex("4")) # 3
# 指定查找范围
print("12345".rindex("3", 0, 3)) # 2
# 找不到报错 # print("12345".rindex("9"))
count
统计字符串在大字符串中出现的次数,可以指定查找的位置:
'''
count的使用
'''
# 查找出现的次数
print("Hello World".count("o")) # 2
# 找不到返回0
print("Hello World".count("1")) # 0
# 可以指定查找范围
print("Hello Wolrd".count("H", 1, 5)) # 0