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.

Python编程语言基础