Python字符串及操作:从基础到高级用法详解
1. 什么是Python字符串?
在Python中,字符串(String)是一种不可变序列类型,用于表示文本数据。字符串由一系列字符组成,可以使用单引号(')、双引号(")或三引号('''或""")来创建。
# 三种创建字符串的方式str1='Hello, World!'# 单引号str2="Python Programming"# 双引号str3='''这是一个 多行字符串'''# 三引号(多行)字符串在Python中是不可变的,这意味着一旦创建,就不能修改其中的字符。所有看似"修改"字符串的操作实际上都是创建了一个新的字符串。
2. 字符串的基本操作
2.1 字符串连接
# 使用 + 运算符连接字符串first_name="张"last_name="三"full_name=first_name+" "+last_nameprint(full_name)# 输出:张 三# 使用 join() 方法连接字符串列表words=["Python","字符串","操作"]sentence=" ".join(words)print(sentence)# 输出:Python 字符串 操作2.2 字符串重复
# 使用 * 运算符重复字符串line="-"*30print(line)# 输出:------------------------------# 创建重复模式pattern="ABC"*3print(pattern)# 输出:ABCABCABC2.3 字符串长度
text="Hello, Python!"length=len(text)print(f"字符串长度:{length}")# 输出:字符串长度:143. 字符串索引和切片
3.1 索引访问
s="Python"print(s[0])# 输出:P(第一个字符)print(s[-1])# 输出:n(最后一个字符)print(s[2])# 输出:t(第三个字符)3.2 切片操作
s="Python Programming"# 基本切片print(s[0:6])# 输出:Python(索引0到5)print(s[7:])# 输出:Programming(从索引7到末尾)print(s[:6])# 输出:Python(从开头到索引5)print(s[::2])# 输出:Pto rgamn(步长为2)print(s[::-1])# 输出:gnimmargorP nohtyP(反转字符串)# 负索引切片print(s[-11:])# 输出:Programming4. 字符串常用方法
4.1 大小写转换
text="Python String Methods"print(text.lower())# 输出:python string methodsprint(text.upper())# 输出:PYTHON STRING METHODSprint(text.title())# 输出:Python String Methodsprint(text.capitalize())# 输出:Python string methodsprint(text.swapcase())# 输出:pYTHON sTRING mETHODS4.2 查找和替换
s="Python is powerful. Python is easy to learn."# 查找子字符串print(s.find("Python"))# 输出:0print(s.rfind("Python"))# 输出:20(从右边开始查找)print(s.index("powerful"))# 输出:10print("Python"ins)# 输出:True# 替换子字符串new_s=s.replace("Python","Java")print(new_s)# 输出:Java is powerful. Java is easy to learn.# 计数子字符串出现次数count=s.count("Python")print(f"Python出现次数:{count}")# 输出:Python出现次数:24.3 去除空白字符
text=" Python Programming "print(text.strip())# 输出:Python Programming(去除两端空白)print(text.lstrip())# 输出:Python Programming (去除左端空白)print(text.rstrip())# 输出: Python Programming(去除右端空白)# 去除特定字符text2="###Python###"print(text2.strip("#"))# 输出:Python4.4 分割和连接
# 分割字符串csv_data="apple,banana,orange,grape"fruits=csv_data.split(",")print(fruits)# 输出:['apple', 'banana', 'orange', 'grape']# 按行分割multiline="第一行\n第二行\n第三行"lines=multiline.splitlines()print(lines)# 输出:['第一行', '第二行', '第三行']# 分区操作email="user@example.com"local,at,domain=email.partition("@")print(f"本地部分:{local}")# 输出:本地部分:userprint(f"域名部分:{domain}")# 输出:域名部分:example.com5. 字符串格式化
5.1 传统格式化(%操作符)
name="张三"age=25score=95.5# 基本格式化print("姓名:%s,年龄:%d"%(name,age))print("分数:%.2f"%score)# 字典格式化info={"name":"李四","age":30}print("姓名:%(name)s,年龄:%(age)d"%info)5.2 format()方法
name="王五"age=28# 位置参数print("姓名:{},年龄:{}".format(name,age))# 关键字参数print("姓名:{name},年龄:{age}".format(name=name,age=age))# 格式化数字pi=3.1415926print("圆周率:{:.2f}".format(pi))# 输出:圆周率:3.14print("二进制:{:b}".format(10))# 输出:二进制:1010print("十六进制:{:x}".format(255))# 输出:十六进制:ff5.3 f-string(Python 3.6+)
name="赵六"age=32salary=8500.50# 基本使用print(f"姓名:{name},年龄:{age}")# 表达式计算print(f"明年年龄:{age+1}")# 格式化数字print(f"月薪:{salary:,.2f}元")# 输出:月薪:8,500.50元print(f"百分比:{0.875:.2%}")# 输出:百分比:87.50%# 调用方法text="hello world"print(f"首字母大写:{text.title()}")# 输出:首字母大写:Hello World6. 字符串检查方法
# 检查字符串内容s1="Python123"s2="12345"s3="HELLO"s4="hello"s5=" "s6="Python Programming"print(s1.isalnum())# 输出:True(字母或数字)print(s2.isdigit())# 输出:True(全是数字)print(s3.isupper())# 输出:True(全大写)print(s4.islower())# 输出:True(全小写)print(s5.isspace())# 输出:True(全是空白字符)print(s6.istitle())# 输出:True(每个单词首字母大写)print(s1.startswith("Py"))# 输出:Trueprint(s6.endswith("ing"))# 输出:True7. 转义字符和原始字符串
7.1 常见转义字符
print("换行:第一行\n第二行")print("制表符:姓名\t年龄\t成绩")print("双引号:\"Python\"")print("单引号:\'Hello\'")print("反斜杠:C:\\Users\\Admin")print("Unicode:\u4e2d\u6587")# 输出:中文7.2 原始字符串
# 普通字符串中的反斜杠需要转义path1="C:\\Users\\Admin\\Documents"print(path1)# 原始字符串(r前缀)中的反斜杠不转义path2=r"C:\Users\Admin\Documents"print(path2)# 输出:C:\Users\Admin\Documents# 正则表达式中常用原始字符串importre pattern=r"\d{3}-\d{8}"8. 字符串编码和解码
# 字符串编码为字节text="你好,世界"utf8_bytes=text.encode("utf-8")gbk_bytes=text.encode("gbk")print(f"UTF-8编码:{utf8_bytes}")print(f"GBK编码:{gbk_bytes}")# 字节解码为字符串decoded_text1=utf8_bytes.decode("utf-8")decoded_text2=gbk_bytes.decode("gbk")print(f"UTF-8解码:{decoded_text1}")print(f"GBK解码:{decoded_text2}")9. 实际应用示例
9.1 用户输入处理
defprocess_user_input():# 获取用户输入user_input=input("请输入您的姓名和年龄(格式:姓名,年龄):")# 清理输入cleaned_input=user_input.strip()# 分割数据if","incleaned_input:name,age_str=cleaned_input.split(",",1)name=name.strip()age_str=age_str.strip()# 验证年龄是否为数字ifage_str.isdigit():age=int(age_str)returnf"用户:{name},年龄:{age}"else:return"错误:年龄必须是数字"else:return"错误:请输入正确的格式(姓名,年龄)"# 测试result=process_user_input()print(result)9.2 文本数据分析
defanalyze_text(text):"""分析文本的统计信息"""# 基本统计total_chars=len(text)words=text.split()total_words=len(words)# 字符类型统计digit_count=sum(1forcharintextifchar.isdigit())letter_count=sum(1forcharintextifchar.isalpha())space_count=sum(1forcharintextifchar.isspace())# 单词长度统计word_lengths=[len(word)forwordinwords]avg_word_length=sum(word_lengths)/total_wordsiftotal_words>0else0return{"总字符数":total_chars,"总单词数":total_words,"数字字符数":digit_count,"字母字符数":letter_count,"空格字符数":space_count,"平均单词长度":round(avg_word_length,2)}# 测试sample_text="Python 3.9 was released in 2020. It has many new features!"stats=analyze_text(sample_text)forkey,valueinstats.items():print(f"{key}:{value}")9.3 简单的文本加密
defcaesar_cipher(text,shift):"""凯撒密码加密"""result=[]forcharintext:ifchar.isalpha():# 确定基准字符base=ord('A')ifchar.isupper()elseord('a')# 移位并取模shifted=(ord(char)-base+shift)%26result.append(chr(base+shifted))else:result.append(char)return''.join(result)# 测试加密和解密original="Hello, Python!"encrypted=caesar_cipher(original,3)decrypted=caesar_cipher(encrypted,-3)print(f"原文:{original}")print(f"加密:{encrypted}")print(f"解密:{decrypted}")10. 性能优化建议
使用join()代替+连接大量字符串
# 不推荐(性能差)result=""foriinrange(10000):result+=str(i)# 推荐(性能好)parts=[str(i)foriinrange(10000)]result="".join(parts)使用字符串方法而非正则表达式处理简单模式
# 简单替换使用replace()而非re.sub()text.replace("old","new")# 更快预编译格式化字符串模板
# 需要多次格式化的场景template="姓名:{},年龄:{},分数:{:.2f}"forstudentinstudents:print(template.format(student.name,student.age,student.score))使用切片而非循环处理字符串
# 更高效的反转字符串方式reversed_str=original_str[::-1]
总结
Python字符串操作是编程中的基础技能,掌握这些操作能显著提高代码效率和可读性。关键要点包括:
- 不可变性:理解字符串不可变的特性,避免不必要的字符串创建
- 格式化选择:根据Python版本选择合适的格式化方法(f-string优先)
- 方法链式调用:合理组合字符串方法,如
text.strip().lower().replace() - 编码处理:在处理中文或网络数据时注意编码问题
- 性能意识:在大规模字符串处理时选择高效的方法
通过不断练习这些字符串操作,你将能够更优雅地处理各种文本处理任务。