在Python编程语言中,字符串是一种非常重要的数据类型,它用于表示文本数据。字符串可以是由字符组成的任何数据,例如字母、数字、标点符号等。在本文中,我们将详细介绍Python中字符串的基本概念、操作和实践应用。
一、字符串的创建
在Python中,可以使用单引号(')或双引号(")来创建字符串。例如:
str1 = 'Hello, World!'
str2 = "Hello, World!"
二、字符串的下标与切片
(一)字符串下标
可以通过索引操作来访问字符串中的单个字符。字符串的下标是指从0开始的整数索引,用于访问字符串中的每个字符。例如,字符串"hello"的第一个字符是’h’,因此它的索引为0;第二个字符是’e’,因此它的索引为1,以此类推。
字符串的索引机制:
正向索引: 0 ~ len(s) - 1负向索引: -len(s) ~ -1以字符串 str1 = ‘ABCDEFG’ 为例,则其下标可以表示为:
下标: A B C D E F G
正: 0 1 2 3 4 5 6
负: -7 -6 -5 -4 -3 -2 -1
以下是一个示例,展示如何使用索引来访问字符串中的字符:
str1 = 'ABCDEFG'
print(str1[0]) # 输出:A
print(str1[6]) # 输出:G
如果需要访问字符串中某个位置之后或之前的所有字符,可以使用负数下标。例如:
print(str1[-1]) # 输出:G
print(str1[-7]) # 输出:A
需要注意的是,字符串的下标是从0开始的,最大值为字符串长度减1。如果使用超出范围的下标访问字符串,会引发IndexError异常。
(二)字符串切片
字符串的切片是指从一个起始位置到另一个结束位置之间的子串。切片操作可以用来提取字符串中的部分内容,或者对字符串进行截取、替换等操作。字符串、列表、元组都支持切片操作。切片操作的基本语法如下:
str[start:end]
str[start:end:step]
其中,start表示切片的起始位置(包含),end表示切片的结束位置(不包含),step为步长,表示选取间隔。示例:
# 索引是通过下标取某一个元素
# 切片是通过下标去某一段元素
s = 'Hello World!'
print(s)
print(s[4]) # o 字符串里的第4个元素
print(s[3:7]) # lo W 包含下标 3,不含下标 7
print(s[:]) # Hello World! 取出所有元素(没有起始位和结束位之分),默认步长为1
print(s[1:]) # ello World! 从下标为1开始,取出 后面所有的元素(没有结束位)
print(s[:4]) # Hell 从起始位置开始,取到 下标为4的前一个元素(不包括结束位本身)
print(s[:-1]) # Hello World 从起始位置开始,取到 倒数第一个元素(不包括结束位本身)
print(s[-4:-1]) # rld 从倒数第4个元素开始,取到 倒数第1个元素(不包括结束位本身)
print(s[1:5:2]) # el 从下标为1开始,取到下标为5的前一个元素,步长为2(不包括结束位本身)
print(s[7:2:-1]) # ow ol 从下标为7的元素开始(包含下标为7的元素),倒着取到下标为2的元素(不包括下标为2的元素)
# python 字符串快速逆置
print(s[::-1]) # !dlroW olleH 从后向前,按步长为1进行取值
需要注意的是,切片操作不会修改原始字符串,而是返回一个新的子串。如果需要修改原始字符串,可以将切片结果赋值给原始变量。例如:
str3 = str1[0:5] + ' Python'
print(str3) # 输出:Hello Python!
print(str1) # 输出:Hello, World! (未改变)
三、字符串的常见操作
(一)查找内容
常用方法:find(), index(), rfind(), rindex()
1. find()
从左向右查找,只要遇到一个符合要求的则返回位置,如果没有找到任何符合要求的则返回-1;示例如下:
path = "https://img-blog.csdnimg.cn/2af25d3bb96b4cf083bf67a3172c8193.png"
# 打印path中图片名
i = path.find('2') #找到元素2
image_name = path[i:]
print(image_name) # 2af25d3bb96b4cf083bf67a3172c8193.png
2. rfind()
从右向左查找,只要遇到一个符合要求的则返回位置,如果没有找到任何符合要求的则返回-1;示例如下:
path = "https://img-blog.csdnimg.cn/2af25d3bb96b4cf083bf67a3172c8193.png"
# 打印图片后缀名
i = path.rfind('.')
suffix_name = path[i:]
print(suffix_name) # .png
3. index()
跟find()方法一样,只不过,find()方法未找到时,返回-1,而index()未找到时,会报一个异常。
path = "https://img-blog.csdnimg.cn/2af25d3bb96b4cf083bf67a3172c8193.png"
# 打印path中图片名
i = path.index('2') #找到元素2
image_name = path[i:]
print(image_name) # 2af25d3bb96b4cf083bf67a3172c8193.png
4. rindex()
类似于 index(),不过是从右边开始。
(二)判断
python提供了非常丰富的方法,可以用来对一个字符串进行判断。常用方法:startswith(), endswith(), isalpha(), isalnum(), isspace()
1. startwith()
判断字符串是否以指定的前缀开头。如果字符串以指定的前缀开头,则返回True,否则返回False。示例如下:
s = '2af25d3bb96b4cf083bf67a3172c8193.png' # 判断是否以2a开头
result = s.startswith('2a')
print(result) # True
2. endwith()
判断字符串是否以指定的前缀开头。如果字符串以指定的前缀开头,则返回True,否则返回False。示例如下:
s = '2af25d3bb96b4cf083bf67a3172c8193.png' # 判断是否以png结尾
result = s.endswith('png')
print(result) # True
3. isalpha()
判断字符串是否只包含字母字符。如果字符串只包含字母字符,则返回True,否则返回False。示例如下:
s = 'a123456'
result = s.isalpha() # 判断是否全为字母
print(result) # False
4. isalnum()
判断字符串是否只包含字母和数字字符。如果字符串只包含字母和数字字符,则返回True,否则返回False。
s = 'a123456'
result = s.isalnum() # 判断是否由数字和字母组成。只要出现了非数字和字母,就返回False.
print(result) # True
5. isspace()
判断字符串是否只包含空格字符。如果字符串只包含空格字符,则返回True,否则返回False。
s = ' '
result = s.isspace() # 判断是否为空格,则返回 True,否则返回 False.
print(result) # True
6. isdigit()
判断字符串是否只包含数字字符。如果字符串只包含数字字符,则返回True,否则返回False。
s = '123456'
result = s.isdigit() # 判断是否由数字和字母组成。只要出现了非数字和字母,就返回False.
print(result) # True
(三)计算出现次数
count()
统计指定字符的个数
path = "https://img-blog.csdnimg.cn/2af25d3bb96b4cf083bf67a3172c8193.png"
# 统计网址中.的个数
count = path.count('.')
print(count) # 3
(四)替换
replace()
在Python中,replace()方法用于替换字符串中的某个子串。它的语法如下:
str.replace(old, new, count)
参数说明:
old: 需要被替换的子串;new: 用于替换的新子串;count(可选): 指定替换的次数,如果不指定,则替换所有匹配的子串。
示例如下:
s = '今天天气好晴朗,处处好风光呀好风光'
result = s.replace('好', '坏', 1)
print(result) # 今天天气坏晴朗,处处好风光呀好风光,只有一处的'好'被替换成了'坏'
result = s.replace('好', '坏', 2) # 今天天气坏晴朗,处处坏风光呀好风光 只有两处的'好'被替换成了'坏'
print(result) # 今天天气坏晴朗,处处坏风光呀好风光
(五)内容分割
内容分隔主要涉及到split(), rsplit(), splitlines(), partition()和rpartition()四个方法。
1. split()
将字符串按照指定的分隔符进行分割,返回一个列表。如果不指定分隔符,默认为空格。示例如下:
text = "Hello World"
result = text.split()
print(result) # 输出:['Hello', 'World']
2. rsplit()
将字符串从右侧开始按照指定的分隔符进行分割,返回一个列表。如果不指定分隔符,默认为空格。示例如下:
text = "Hello World"
result = text.rsplit()
print(result) # 输出:['Hello World']
text = "apple,banana,orange"
result = text.rsplit(",", 1
print(result) # 输出:['apple', 'banana,orange']
3. splitlines()
将字符串按照换行符进行分割,返回一个列表。示例如下:
text = "Hello
World"
result = text.splitlines()
print(result) # 输出:['Hello', 'World']
4. partition()
将字符串按照指定的分隔符进行分割,返回一个三元组 (head, separator, tail)。其中 head 是分隔符之前的部分,separator 是分隔符本身,tail 是分隔符之后的部分。如果不指定分隔符,默认为空格。示例如下:
text = "Hello World"
result = text.partition(" ")
print(result) # 输出:('Hello', ' ', 'World')
5. rpartition()
将字符串从右侧开始按照指定的分隔符进行分割,返回一个三元组 (tail, separator, head)。其中 tail 是分隔符之后的部分,separator 是分隔符本身,head 是分隔符之前的部分。如果不指定分隔符,默认为空格。示例如下:
text = "Hello World"
result = text.partition(" ")
print(result) # 输出:('Hello', ' ', 'World')
(六)修改大小写
1. capitalize
常用于将字符串的第一个字母转换为大写,例如:
text = "hello world"
result = text.capitalize()
print(result) # 输出:Hello world
2. title:
常用于将字符串中的每个单词的首字母转换为大写,其余字母转换为小写,例如:
text = "hello world"
result = text.title()
print(result) # 输出:Hello World
3. upper
常用于将字符串中的所有字母转换为大写,例如:
text = "hello world"
result = text.upper()
print(result) # 输出:HELLO WORLD
4. lower
常用于将字符串中的所有字母转换为小写,例如:
text = "HELLO WORLD"
result = text.lower()
print(result) # 输出:hello world
(七)空格处理
在Python中,空格处理是一种常用的字符串操作。常见方法有:ljust,rjust,center,lstrip,rstrip,strip
1. ljust()
将字符串左对齐,并使用指定的填充字符(默认为空格)填充到指定的宽度。返回一个新字符串,原字符串不变。示例如下:
s = "hello"
s = s.ljust(10)
print(s) # 输出 " hello"
在这个例子中,我们将字符串"hello"左对齐,并使用空格填充到10个字符的宽度。
2. rjust()
将字符串右对齐,并使用指定的填充字符(默认为空格)填充到指定的宽度。返回一个新字符串,原字符串不变。示例如下:
s = "hello"
s = s.rjust(10)
print(s) # 输出 "hello "
在这个例子中,我们将字符串"hello"右对齐,并使用空格填充到10个字符的宽度。
3. center()
将字符串居中对齐,并使用指定的填充字符(默认为空格)填充到指定的宽度。返回一个新字符串,原字符串不变。示例如下:
s = "hello"
s = s.center(10)
print(s) # 输出 " hello "
在这个例子中,我们将字符串"hello"居中对齐,并使用空格填充到10个字符的宽度。
4. lstrip():
移除字符串左侧的指定字符(默认为空格)。返回一个新字符串,原字符串不变。示例如下:
s = " hello "
s = s.lstrip()
print(s) # 输出 "hello "
5. rstrip()
移除字符串右侧的指定字符(默认为空格)。返回一个新字符串,原字符串不变。
s = " hello "
s = s.rstrip()
print(s) # 输出 " hello"
6. strip()
同时移除字符串左侧和右侧的指定字符(默认为空格)。返回一个新字符串,原字符串不变。
s = " hello "
s = s.strip()
print(s) # 输出 "hello"
(八)字符串拼接
join()
该方法将一个可迭代对象中的所有字符串连接成一个新的字符串。示例如下:
str_list = ["hello", "world", "!"]
new_str = "".join(str_list)
print(new_str) # 输出: helloworld!
在上面的示例中,我们首先定义了一个包含三个字符串的列表str_list。然后,我们使用空字符串""作为分隔符,调用join()方法将列表中的所有字符串连接成一个新的字符串。
注意,分隔符可以是任何字符串,包括空格、逗号等。例如,如果我们要将一个包含姓名和电子邮件地址的列表连接成一个字符串,可以使用逗号作为分隔符:
name_list = ["Alice", "Bob", "Charlie"]
email_list = ["alice@example.com", "bob@example.com", "charlie@example.com"]
name_email_list = [name + " <" + email + ">" for name, email in zip(name_list, email_list)]
new_str = ", ".join(name_email_list)
print(new_str) # 输出: Alice , Bob , Charlie
在这个例子中,我们首先定义了两个列表namelist和emaillist,分别包含姓名和电子邮件地址。然后,我们使用列表推导式将它们组合成一个新的列表nameemaillist,每个元素都是姓名和电子邮件地址的组合形式。最后,我们使用逗号和空格作为分隔符将所有元素连接成一个新的字符串。
四、字符串的format方法
在Python中,字符串的format方法是一种非常方便的字符串格式化方式。它允许我们使用占位符(placeholder)来表示需要替换的值,然后通过传递参数列表来将这些值替换到字符串中。下面是一个简单的示例:
name = "Alice"
age = 25
print("My name is {} and I'm {} years old.".format(name, age))
在这个例子中,我们使用了两个占位符 {},分别表示需要替换的字符串和整数。通过调用 format() 方法并传递一个包含相应值的元组,我们可以将这些值替换到字符串中的占位符位置。输出结果为:
My name is Alice and I'm 25 years old.
除了使用占位符外,我们还可以在 format() 方法中指定要替换的占位符的位置。例如:
print("My name is {0} and I'm {1} years old.".format(name, age))
print("My name is {0} and I'm {1} years old.".format(age, name))
这两个示例中,第一个示例将 name 放在了第一个占位符的位置,而第二个示例将 age 放在了第一个占位符的位置。输出结果都是相同的:
My name is Alice and I'm 25 years old.
My name is 25 and I'm Alice years old.
需要注意的是,format() 方法返回的是一个新的字符串,它并不会修改原始字符串。如果需要修改原始字符串,可以使用字符串的 replace() 方法或者字符串的 join() 方法来进行操作。
除了基本的占位符外,format() 方法还支持一些高级用法,如格式化数字、日期和时间等。具体可以参考官方文档:https://docs.python.org/3/library/stdtypes.html#str.format
五、案例实战
(一)模拟文件上传
要求:模拟文件上传,键盘输入上传图片名称(xxx.xxx),判断文件名是否大于6位以上,扩展名是否为:jpg,gif,png格式如果不是,则提示上传失败,如果名字不满足条件,而扩展名满足条件,则随机生成一个由6位数字和字母的组成的文件名,且提示成功上传xxx.xxx
代码如下:
import random
docx = input("请输入上传图片全称:")
# 检查文件名是否以'.jpg'、'.gif或'.png结尾
if docx.endswith('.jpg') or docx.endswith('.gif') or docx.endswith('.png'):
# 找到文件名中最后一个点的索引
i = docx.rfind('.')
# 提取文件名(不包括扩展名)——切片
filename = docx[:i]
# 获取文件名的长度
long = len(filename)
# 如果文件名长度大于等于6,则打印成功上传的消息,并显示完整的文件名
if long >= 6:
print("成功上传图片:%s" % docx)
# 如果文件名长度小于6,则随机生成一个由数字和字母组成的6位字符作为文件名,并打印成功上传的消息,同时显示完整的文件名
else:
ch = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
filename = ''.join(random.choices(ch, k=6))
"""
方法二:通过获取字符串下标来表示
str='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
for i in range(6):
index=random.randint(0,len(ch)-1) #随机产生下标
filename+=s[index] #获取下标匹配的字母
print('filename')
"""
print("成功上传图片:%s%s" % (filename, docx[i:]))
# 如果文件名不以'.jpg'、'.gif或'.png结尾,则打印上传失败的消息,提示文件格式错误
else:
print("上传失败,文件格式错误")
输出结果:
测试1
请输入上传图片全称:123456.png
成功上传图片:123456.png
测试2
请输入上传图片全称:123.png
成功上传图片:rHRyOl.png
测试3
请输入上传图片全称:123456
上传失败,文件格式错误
(二)模拟账户登陆
要求:
用户输入用户名或手机号码进行登录。 系统会检查用户输入的用户名或手机号码是否符合以下要求:
- 用户名必须是6位或以上的小写字母,且首字母不能是数字。
- 手机号码必须是11位的纯数字。
如果用户名或手机号码符合要求,则进入下层验证。
系统会进一步验证用户输入的用户名和密码是否匹配。
- 密码必须是6位。
- 如果用户名和密码匹配,则登录成功。
- 如果用户名和密码不匹配,则登录失败。
代码如下:
import random
mark = True # 方便控制循环
while mark:
name = input("手机号/用户名:")
if name.isdigit() and len(name) == 11 or name.islower() and len(name) >= 6 and name.capitalize():
# 检查输入的手机号/用户名格式是否正确
while True:
password = input("密码:")
if len(password) == 6: # 检查密码是否为6位
if name == 'naturalpride' or name == '12345678911' and password == '123456':
# 检查用户名和密码是否匹配
ch = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
verification_code = ''.join(random.choices(ch, k=4)) # 生成4位随机验证码
print("验证码:" + verification_code)
if input("请输入验证码:") == verification_code: # 检查输入的验证码是否正确
print("登录成功")
mark = False
break
else:
print("验证码错误,登录失败")
else:
print("密码错误,登录失败")
break
else:
print("密码长度必须为6位,登录失败")
break
else:
print("手机号/用户名格式错误,登录失败")
输出结果:
测试1
手机号/用户名:12345678911
密码:123456
验证码:d6Yt
请输入验证码:d6Yt
登录成功
测试2
手机号/用户名:12345678911
密码:123
密码长度必须为6位,登录失败
手机号/用户名:12345678911
密码:123456
验证码:3SFI
请输入验证码:3sfi
验证码错误,登录失败
密码:123456
验证码:4fj0
请输入验证码:4fj0
登录成功
(三)论坛模拟
要求:模拟论坛:昨天晚会遇到一个漂亮的小姐姐?要不要加个微信?输入用户名:小白反复回复:1.回复的内容不能为空2.里面不能存在敏感词汇3.最多评论20个字,剩余多少个字。4.回复的内容前后不能有空格小白:抓紧表白小黑:。。。。。小花:。。。。。代码如下:
msg = input("发表一句话:")
print('-' * 50)
print("以下为回复内容:")
mark = True
while mark:
# 输入用户名
user_name = input("用户名:")
# 回复内容
while True:
reply_content = input("评论:")
comment = reply_content.strip()
# 验证内容
if len(comment) != 0:
# 字数不超过20
if len(comment) <= 20:
# 敏感词汇替换
comment = comment.replace('丑陋', '**')
print('{}发表的评论为:\n\t{}'.format(user_name, comment))
print()
mark = False
break
else:
print('不能超过20个字,重新评论')
else:
print('回复的内容不能为空')
输出结果:
测试1
发表一句话:昨天晚会遇到一个漂亮的小姐姐?要不要加个微信?
--------------------------------------------------
以下为回复内容:
用户名:小白
评论:这么丑陋,加什么加
小白发表的评论为:
这么**,加什么加
测试2
发表一句话:昨天晚会遇到一个漂亮的小姐姐?要不要表白?
--------------------------------------------------
以下为回复内容:
用户名:小黑
评论:这么丑陋,加什么加,这么丑陋,加什么加,这么丑陋,加什么加,这么丑陋,加什么加,这么丑陋,加什么加,这么丑陋,加什么加,这么丑陋,加什么加
不能超过20个字,重新评论
评论:这么丑陋,还加什么加
小黑发表的评论为:
这么**,还加什么加