掘金 后端 ( ) • 2024-03-22 10:30

字符串是 Python 中最常用的数据类型之一,它可以包含字母、数字、符号、标点以及空格和换行符。本文将介绍字符串的基本概念和操作方法。

创建字符串

在 Python 中,可以通过将字符(字母、符号或数字)放在一对单引号 '' 或双引号 "" 之间来创建字符串。

print("hello")  # hello
print('hello')  # hello

单引号和双引号可以混合使用。当单引号被双引号包围时,单引号属于字符串的一部分;当双引号被单引号包围时,双引号属于字符串的一部分。

print("'oxxo' is my name")  # 'oxxo' is my name
print('"oxxo" is my name')  # "oxxo" is my name

对于多行字符串(即文本较多且包含换行的字符串),可以使用连续三个单引号将文本包围起来,这样 Python 将会保留文本中的换行。

a = """Millions of developers and companies build,
ship, and maintain their software on GitHub—the
largest and most advanced development platform
in the world."""
print(a)

此外,还可以使用 str() 函数将其他类型的数据转换成字符串。例如,将数字 123 转换成字符串 '123'

a = str(123)
print(a)   # '123'

转义字符

所谓的「转义」,是指改变字符串中某些字符的特殊意义。在需要转义的字符前加上反斜杠 \,就可以赋予这些字符特殊的含义。常用的转义字符包括:

  • \\:转义反斜杠

  • \':显示单引号

  • \":显示双引号

  • \b:退格(删除前一个字符)

  • \n:换行

  • \t:制表符(tab键)

例如,下面的代码演示了如何在字符串中使用转义字符。让结果同时显示单引号、双引号和反斜杠。

a = 'hello "World", my name is \'oxxo\', \\\\'
print(a)

# hello "World", my name is 'oxxo', \\

下方的例子使用 \n 进行换行。

a = 'hello World,\nmy name is oxxo,\nhow are you?'
print(a)

# hello World,
# my name is oxxo,
# how are you?

原始字符串

在字符串前加上 r 表示这是一个「原始字符串」(raw string),不会进行转义。下方的程序执行时,a 会打印出原样(因为不进行转义),b 则会将 \n 转义为换行,就会打印出换行的结果。

a = r'123\n456'
b = '123\n456'
print(a)     # 123\n456
print(b)
# 123
# 456

字符串拼接

字符串拼接有三种方式:+ 号、字符串相加、括号。

  • 使用 + 号可以针对「变量」与「字符串字面量」进行拼接。
a = 'hello'
b = ' world'
c = a + b + '!!!'
print(c)

# hello world!!!

  • 使用「字符串相加」只能针对「字符串字面量」(不是变量)进行拼接。
a = 'hello' ' world' '!!!'
print(a)

# hello world!!!

如果有很多字符串,可以将其放在括号里进行拼接。

a = ('a' "b" 'c' "'" 'ok' "'")
print(a)

# abcok

重复字符串

在字符串后面使用 * 加上数字,可以指定该字符串要重复的次数。下方的例子,将会将 ok 重复10次。

a = 'ok'*10
print(a)

# okokokokokokokokokok

如果数字是字符串,也可以使用 * 进行重复。下方的例子,会出现 20 个 ok

a = 'ok'*5
b = a * 4
print(b)

# okokokokokokokokokokokokokokokokokokokok

获取字符串中的字符或子串

使用 [] 可以获取某个字符,因为每个字符在字符串中都有各自的「索引 offset」,从左边数第一个索引为 0,接下来的是 1。如果指定 -1 则会取最右边的字符,-2 则是从右边数的第二个,依此类推。

a = 'hello world'
print(a[0])  # h(第一个字符)
print(a[3])  # l(第四个字符)
print(a[-1]) # d(最后一个字符)

如果要取得某一串文字,可以使用「切片」的方式,定义切片的方式为一组方括号、一个 start(开始索引)、一个 end(结束索引)和中间的 step(间隔),常见的规则如下:

定义 说明 [] 取出全部字符,从开始到结束 [start:] 取出 start 的位置一直到结束的字符 [:end] 取出从开始一直到 end 的「前一个位置」的字符 [start:end] 取出从 start 位置到 end 的「前一个位置」的字符 [start:end:step] 取出 start 位置到 end 的「前一个位置」的字符,跳过 step 个字符
a = '0123456789abcdef'
print(a[:])
# 输出 0123456789abcdef(取出全部字符)
print(a[5:])
# 输出 56789abcdef(从 5 开始到结束)
print(a[:5])
# 输出 01234(从 0 开始到第 4 个(5-1))
print(a[5:10])
# 输出 56789(从 5 开始到第 9 个(10-1))
print(a[5:-3])
# 输出 56789abc(从 5 开始到倒数第 4 个(-3-1))
print(a[5:10:2])
# 输出 579(从 5 开始到第 9 个,中间跳过 2 个)

获取字符串长度

len() 函数可以取得一串字符串的长度(总共包含多少个字符),取得的长度不包含转义字符。下方的例子会显示 a 的字符串长度。

a = '0123456789-\\\"\''
print(len(a)) # 15
print(a) # 0123456789-\"'

拆分字符串

split() 函数可以将一个字符串,根据指定的「分隔符」拆分成一系列字符串。如果不指定分隔符,默认以空白字符进行拆分。

a = 'hello world, I am oxxo, how are you?'
b = a.split(',')
c = a.split(' ')
d = a.split()
print(b) # ['hello world', ' I am oxxo', ' how are you?']
print(c) # ['hello', 'world,', 'I', 'am', 'oxxo,', 'how', 'are', 'you?']
print(d) # ['hello', 'world,', 'I', 'am', 'oxxo,', 'how', 'are', 'you?']

替换字符串

replace() 函数有三个参数:原始字符串,新的字符串,替换的数量。如果没有指定数量,就会将内容中所有指定的字符串替换成新的字符串。

如果要进行更复杂规则的替换,就需要使用「正则表达式」。

a = 'hello world, lol'
b = a.replace('l', 'xxx')
c = a.replace('l', 'xxx', 2)
print(b) # hexxxxxxo worxxxd, XxXoxxx (所有的 l 都被换成 XXX)
print(c) # hexxxxxXo world, lol(前两个 l 被换成 XXX)

移除字符

strip() 函数可以去除字符串头或尾的空白字符,使用 rstrip() 函数可以只去除右边的空白字符,使用 lstrip() 函数可以只去除左边的空白字符。括号内可以填入指定的字符,就会将开头或结尾指定的字符去除。

a = '  hello!!'
b = a.strip()
e = a.strip('!')
c = a.lstrip()
d = a.rstrip()
print(b) # hello!!
print(c) # hello!!
print(d) #   hello!!
print(e) #   hello

搜索字符串

如果要查找字符串中的某个字符,可以使用 find()index() 函数。这两个函数从左侧开始查找,找到指定的字符串或字符时,会返回第一次出现的位置(offset)。如果改成 rfind()rindex() 就会从右侧开始查找,找到指定的字符串或字符时,会返回最后一次出现的位置(offset)。如果没有找到结果,find() 会返回 -1 的数值,index() 会直接抛出错误信息。

a = 'hello world, I am oxxo, I am a designer!'
b = a.find('am')
c = a.rfind('am')
print(b)  # 15(第一个 'am' 在 15 的位置)
print(c)  # 26(最后一个 'am' 在 26 的位置)

下方列出一些好用的查找函数:

  • startswith() 函数用来判断字符串是否以某个子串开头,符合返回 True,不符合返回 False。

  • endswith() 函数用来判断字符串是否以某个子串结尾,符合返回 True,不符合返回 False。

  • isalnum() 函数用来判断字符串是否只包含字母和数字,符合返回 True,不符合返回 False。

  • count() 函数用来判断某个子串在字符串中出现了多少次。

a = 'hello world, I am oxxo, I am a designer!'
b = a.startswith('hello')
c = a.endswith('hello')
d = a.isalnum()
e = a.count('am')
print(b)  # True(开头是 'hello')
print(c)  # False(结尾不是 'hello')
print(d)  # False(里面包含逗号和感叹号)
print(e)  # 2(出现 2 次 'am')

大小写转换

Python 提供了四种内置的转换函数来处理字符串的大小写:

  • title() 函数将每个单词的首字母大写。

  • upper() 函数将所有字母大写。

  • lower() 函数将所有字母小写。

  • swapcase() 函数将每个字母的大小写对调。

a = 'Hello world, I am OXXO'
b = a.title()
c = a.upper()
d = a.lower()
e = a.swapcase()
print(b) # Hello World, I Am Oxxo
print(c) # HELLO WORLD, I AM OXXO
print(d) # hello world, i am oxxo
print(e) # hELLO WORLD, i AM oxxo