Python:字符串操作
1. 定义
在Python中,字符串是一种不可变的有序字符序列,可以使用单引号(')、双引号(")、三引号('''或""")来定义。
使用单引号:s1 = 'Hello'
使用双引号:s2 = "Python"
使用三引号(常用于多行字符串):
s3 = '''This is a multi - line string.'''
2. 索引与切片
索引:字符串中的每个字符都有对应的索引,索引从0开始。可以通过索引来访问字符串中的单个字符。
例如,对于字符串s = "Hello",s[0]表示字符'H',s[1]表示字符'e'等。
也可以使用负索引从字符串末尾开始访问字符,s[-1]表示字符串的最后一个字符,s[-2]表示倒数第二个字符,以此类推。
在Python中,字符串是不可变对象。当对字符串进行索引操作时,只是获取字符串中的某个字符,并不会影响字符串本身的内容。
切片:可以使用切片操作来获取字符串的子串。切片的语法是 [start:stop:step] ,其中start表示起始索引(包含),stop表示结束索引(不包含),step表示步长。
切片操作返回的是一个新的字符串对象,它是原始字符串的一个副本(子串部分)。这意味着即使对切片结果进行操作(如再次切片、连接等),原始字符串也不会被修改。
例如,对于字符串s = "Python":
s[1:4]得到yth,即从索引1(包含)到索引4(不包含)的子串。
s[:3]得到Pyt,相当于从索引0开始到索引3(不包含)的子串,如果省略start,则从字符串开头开始切片。
s[2:]得到thon,相当于从索引2开始到字符串末尾的子串,如果省略stop,则切片到字符串末尾。
s[::2]得到Pto,步长为2,表示每隔一个字符取一个字符。
3. 字符串操作
连接:可以使用+运算符来连接两个或多个字符串。
例如:s1 = "Hello",s2 = "World",s1 + s2得到HelloWorld。
重复:使用*运算符可以重复一个字符串多次。
例如:s = "Hi",s * 3得到HiHiHi。
查找:在Python中,可以使用以下几种方法在字符串中查找子串:
(1). 使用in关键字
in关键字用于检查一个字符串是否包含另一个字符串,它返回一个布尔值(True或False)。
s = "Hello, World!" if "World" in s: print("包含子串") else: print("不包含子串")
这种方法简单直接,适用于只需要知道子串是否存在于字符串中的情况,但它不能提供子串的位置信息。
(2). 使用find()方法
find()方法用于查找子串在字符串中的起始索引位置。如果找到子串,则返回子串的第一个字符在原字符串中的索引;如果找不到,则返回 - 1。
s = "Hello, World!" index = s.find("World") if index!= - 1: print(f"子串在索引 {index} 处开始") else: print("未找到子串")
可以指定查找的起始位置和结束位置(不包含),例如:s.find(substring, start, end)。这在只需要在字符串的特定部分查找子串时很有用。
(3). 使用index()方法
index()方法与find()方法类似,也是用于查找子串的起始索引位置。但是,如果找不到子串,index()方法会引发ValueError异常,而find()方法返回 - 1。
try: s = "Hello, World!" index = s.index("Universe") print(f"子串在索引 {index} 处开始") except ValueError: print("未找到子串")
(4). 使用rfind()和rindex()方法(从右向左查找)
rfind()方法从字符串的右侧(末尾)开始查找子串,并返回子串最后一次出现的起始索引位置。如果找不到,则返回 - 1。
s = "Hello, World! Hello" index = s.rfind("Hello") print(f"子串最后一次出现的索引为 {index}")
rindex()方法与rfind()类似,但找不到子串时会引发ValueError异常。
替换:替换字符串中的子串。
(1). 使用replace方法:将字符串中的指定子串替换为另一个子串。
语法:str.replace(old, new[, count]),其中str是原始字符串,old是要被替换的子串,new是用于替换的子串,count(可选)是指定替换的最大次数。
例如,将字符串中的某个单词替换掉:
s = "Hello, World!" new_s = s.replace("World", "Python") print(new_s)
输出结果为:Hello, Python!
指定替换次数:如果只想替换部分出现的子串,可以使用count参数。例如:
s = "aaabbbccc" new_s = s.replace("a", "x", 2) print(new_s)
这里只将前两个a替换为x,输出结果为:xxabbbccc
(2). 使用正则表达式(e模块)进行替换(适用于更复杂的替换模式)
简单替换:首先需要导入e模块。如果要替换字符串中的所有数字,可以这样做:
import re s = "abc123def456" new_s = re.sub(r'd+', 'x', s) print(new_s)
这里d+是正则表达式,表示匹配一个或多个数字,e.sub函数将匹配到的子串替换为x,输出结果为:abcxdefx
基于分组的替换:正则表达式中的分组可以在替换时使用。例如,将字符串中的连续重复字母替换为单个字母并加上一个*:
import re s = "aaabbbccc" new_s = re.sub(r'([a - z])+', r'*', s) print(new_s)
在正则表达式([a - z])+中,([a - z])是一个分组,匹配一个字母,表示引用第一个分组匹配到的内容,+表示匹配前面的内容一次或多次。e.sub函数将匹配到的内容替换为分组内容加上*,输出结果为:a*b*c*
4. 字符串格式化
使用%格式化:这是一种较旧的格式化方法。
name = "John" age = 25 s = "My name is %s and I'm %d years old." % (name, age)
使用format()方法:
name = "John" age = 25 s = "My name is {} and I'm {} years old.".format(name, age)
还可以通过索引指定参数的顺序:
s = "My name is {1} and I'm {0} years old.".format(age, name)
使用f - strings(格式化字符串字面值):
在Python 3.6及以上版本可用。例如:
name = "John" age = 25 s = f"My name is {name} and I'm {age} years old."
5. 大小写转换方法
lower()方法:将字符串中的所有大写字母转换为小写字母。例如:
s = "Hello, WORLD!" new_s = s.lower() print(new_s)
输出结果为:hello, world!
upper()方法:与lower()相反,将字符串中的所有小写字母转换为大写字母。例如:
s = "hello, world!" new_s = s.upper() print(new_s)
输出结果为:HELLO, WORLD!
swapcase()方法:交换字符串中的大小写字母,即大写字母变为小写字母,小写字母变为大写字母。例如:
s = "Hello, wORLd!" new_s = s.swapcase() print(new_s)
输出结果为:hELLO, WorlD!
capitalize()方法:将字符串的第一个字符转换为大写字母,其余字符转换为小写字母。例如:
s = "hello, world!" new_s = s.capitalize() print(new_s)
输出结果为:Hello, world!
title()方法:将字符串中每个单词的第一个字符转换为大写字母,其余字符转换为小写字母。例如:
s = "hello, world!" new_s = s.title() print(new_s)
输出结果为:Hello, World!
6. 字符串分割与连接方法
split()方法:根据指定的分隔符将字符串分割成一个列表。如果不指定分隔符,则默认以空格为分隔符。例如:
s = "Hello, World!" parts = s.split(", ") print(parts)
输出结果为:['Hello', 'World!']
rsplit()方法:与split()类似,但从字符串的末尾开始分割。例如:
s = "Hello, World!" parts = s.rsplit(", ", 1) print(parts)
输出结果为:['Hello', 'World!']
join()方法:与split()相反,用于将一个字符串列表连接成一个字符串,连接时使用调用该方法的字符串作为分隔符。例如:
parts = ['Hello', 'World!'] s = ", ".join(parts) print(s)
输出结果为:Hello, World!
7. 字符串判断方法
isalnum()方法:如果字符串中的所有字符都是字母或数字,则返回True,否则返回False。例如:
s1 = "abc123" s2 = "abc 123" print(s1.isalnum()) print(s2.isalnum())
输出结果为:True和False
isalpha()方法:如果字符串中的所有字符都是字母,则返回True,否则返回False。例如:
s1 = "abc" s2 = "abc123" print(s1.isalpha()) print(s2.isalpha())
输出结果为:True和False
isdigit()方法:如果字符串中的所有字符都是数字,则返回True,否则返回False。例如:
s1 = "123" s2 = "abc123" print(s1.isdigit()) print(s2.isdigit())
输出结果为:True和False
isspace()方法:如果字符串中的所有字符都是空白字符(空格、制表符、换行符等),则返回True,否则返回False。例如:
s1 = " " s2 = "abc" print(s1.isspace()) print(s2.isspace())
输出结果为:True和False
8. 字符串编码与解码方法(主要用于处理字符编码问题)
encode()方法:将字符串转换为字节序列,根据指定的编码方式进行编码。例如,将字符串编码为UTF - 8格式:
s = "你好,世界!" byte_s = s.encode('utf - 8') print(byte_s)
输出结果为字节序列:b'你好,世界!'
decode()方法:与encode()相反,将字节序列解码为字符串,需要指定正确的编码方式。例如:
byte_s = b'你好,世界!' s = byte_s.decode('utf - 8') print(s)
输出结果为:你好,世界!
9. 字符串格式化相关方法(虽然有更现代的格式化方式,但这些方法仍然有用)
format()方法:用于格式化字符串。例如:
name = "John" age = 25 s = "My name is {} and I'm {} years old.".format(name, age) print(s)
输出结果为:My name is John and I'm 25 years old.
format_map()方法:与format()类似,但接受一个字典作为参数。例如:
d = {'name': 'John', 'age': 25} s = "My name is {name} and I'm {age} years old.".format_map(d) print(s)
输出结果为:My name is John and I'm 25 years old.