在 Python 中,字符串是一个不可变的 Unicode 字符序列。每个字符都有一个唯一的数值对应于 UNICODE 标准。但是,即使所有的字符都是数字,整个序列本身也没有任何数值意义。为了区分字符串与数字和其他标识符,在其文字表示中,字符序列被包含在单引号、双引号或三重引号内。因此,1234 是一个数字(整数),而 '1234' 是一个字符串。
创建 Python 字符串
只要包含相同的字符序列,单引号、双引号或三重引号都可以用来创建字符串。因此,下面的字符串表示是等价的。
>>> '欢迎来到 TutorialsPoint'
'欢迎来到 TutorialsPoint'
>>> "欢迎来到 TutorialsPoint"
'欢迎来到 TutorialsPoint'
>>> '''欢迎来到 TutorialsPoint'''
'欢迎来到 TutorialsPoint'
>>> """欢迎来到 TutorialsPoint"""
'欢迎来到 TutorialsPoint'
从上面的语句可以看出,在内部 Python 把字符串存储为单引号内的内容。
在旧版本中,字符串内部存储为 8 位 ASCII,因此需要附加 'u' 来使其成为 Unicode。自从 Python 3 开始,所有字符串都以 Unicode 形式表示。因此现在不再需要在字符串后面添加 'u'。
访问字符串中的值
Python 不支持字符类型;这些被视为长度为一的字符串,因此也被认为是子字符串。
为了访问子字符串,可以使用索引或索引范围内的方括号来进行切片以获取你的子字符串。例如:
var1 = 'Hello World!'
var2 = "Python Programming"
print ("var1[0]: ", var1[0])
print ("var2[1:5]: ", var2[1:5])
当上述代码被执行时,会产生如下结果:
var1[0]: H
var2[1:5]: ytho
更新字符串
你可以通过重新赋值变量来“更新”一个已存在的字符串。新的值可以与之前的值相关或者完全不同。例如:
var1 = 'Hello World!'
print ("更新后的字符串: ", var1[:6] + 'Python')
当上述代码被执行时,会产生如下结果:
更新后的字符串: Hello Python
转义字符
下表是一些可以用反斜杠表示法表示的转义或非打印字符列表。
转义字符在单引号和双引号字符串中都会被解释。
反斜杠表示法 |
十六进制字符 |
描述 |
\a |
0x07 |
铃声或警告 |
\b |
0x08 |
退格 |
\cx |
|
控制-x |
\C-x |
|
控制-x |
\e |
0x1b |
逃逸 |
\f |
0x0c |
换页 |
\M-\C-x |
|
Meta-控制-x |
\n |
0x0a |
换行 |
\nnn |
|
八进制表示法,其中 n 的范围是 0-7 |
\r |
0x0d |
回车 |
\s |
0x20 |
空格 |
\t |
0x09 |
制表符 |
\v |
0x0b |
垂直制表符 |
\x |
|
字符 x |
\xnn |
|
十六进制表示法,其中 n 的范围是 0-9,a-f 或 A-F |
字符串特殊操作符
假设字符串变量 a 持有 'Hello' 并且变量 b 持有 'Python',那么:
操作符 |
描述 |
示例 |
+ |
连接 - 在操作符两侧添加值 |
a + b 将得到 HelloPython |
* |
重复 - 创建多个相同字符串的新字符串 |
a*2 将得到 HelloHello |
[] |
切片 - 获取指定索引处的字符 |
a[1] 将得到 e |
[:] |
范围切片 - 获取指定范围内的字符 |
a[1:4] 将得到 ell |
in |
成员资格 - 如果字符存在于给定字符串中则返回真 |
H in a 将得到 1 |
not in |
成员资格 - 如果字符不存在于给定字符串中则返回真 |
M not in a 将得到 1 |
r/R |
原始字符串 - 抑制转义字符的实际含义。原始字符串的语法与普通字符串完全相同,唯一的例外是原始字符串操作符,字母 "r",它紧跟着第一个引号。 |
print r'\n' 打印 \n 和 print R'\n' 打印 \n |
% |
格式化 - 执行字符串格式化 |
见下一节 |
字符串格式化操作符
Python 最酷的功能之一是字符串格式化操作符 %。这个操作符仅适用于字符串,并弥补了没有 C 的 printf() 家族函数的问题。以下是一个简单的例子:
print ("我的名字是 %s 并且体重是 %d kg!" % ('Zara', 21))
当上述代码被执行时,会产生如下结果:
我的名字是 Zara 并且体重是 21 kg!
以下是与 % 一起使用的完整符号列表:
序号 |
格式符号 & 转换 |
1 |
%c |
2 |
%s |
3 |
%i |
4 |
%d |
5 |
%u |
6 |
%o |
7 |
%x |
8 |
%X |
9 |
%e |
10 |
%E |
11 |
%f |
12 |
%g |
13 |
%G |
其他支持的符号和功能列于下表:
序号 |
符号 & 功能 |
1 |
* |
2 |
- |
3 |
+ |
4 |
|
5 |
# |
6 |
0 |
7 |
% |
8 |
(var) |
9 |
m.n. |
Python 字符串中的双引号
如果你想在字符串中嵌入一些文本,并且这部分文本需要用双引号括起来,那么整个字符串应该放在单引号中。同样地,如果要嵌入单引号括起的文本,则字符串应该写在双引号中。
var = '欢迎来到 "Python 教程" 来自 TutorialsPoint'
print ("var:", var)
var = "欢迎来到 'Python 教程' 来自 TutorialsPoint"
print ("var:", var)
它将产生如下输出:
var: 欢迎来到 "Python 教程" 来自 TutorialsPoint
var: 欢迎来到 'Python 教程' 来自 TutorialsPoint
三重引号
要形成带有三重引号的字符串,可以使用三重单引号或三重双引号——这两个版本是相似的。
var = '''欢迎来到 TutorialsPoint'''
print ("var:", var)
var = """欢迎来到 TutorialsPoint"""
print ("var:", var)
它将产生如下输出:
var: 欢迎来到 TutorialsPoint
var: 欢迎来到 TutorialsPoint
Python 多行字符串
三重引号字符串对于形成多行字符串很有用。
var = '''
欢迎来到
Python 教程
来自 TutorialsPoint
'''
print ("var:", var)
它将产生如下输出:
var:
欢迎来到
Python 教程
来自 TutorialsPoint
字符串与算术运算符
字符串是非数值数据类型。显然,我们不能使用算术运算符与字符串操作数。在这种情况下 Python 会引发 TypeError。
print ("Hello"-"World")
当执行上述程序时,它将生成如下错误:
>>> "Hello"-"World"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'str' and 'str'
获取 Python 字符串的类型
Python 中的字符串是一个 str 类的对象。这可以通过 type() 函数来验证。
var = "欢迎来到 TutorialsPoint"
print (type(var))
它将产生如下输出:
<class 'str'>
Python 内置字符串方法
Python 包含以下内置的方法来操控字符串:
方法描述
-
-
casefold()
-
将字符串中的所有大写字母转换成小写。类似于
lower()
,但是也适用于 UNICODE 字符。
-
center(width, fillchar)
-
返回一个空格填充的字符串,使得原始字符串居中并且总长度为
width
列。
-
count(str, beg= 0, end=len(string))
-
统计
str
在字符串中出现的次数,如果提供了开始索引 beg
和结束索引 end
,则统计子字符串中的出现次数。
-
decode(encoding='UTF-8', errors='strict')
-
使用编码编码注册的编解码器解码字符串。
encoding
默认为默认的字符串编码。
-
encode(encoding='UTF-8', errors='strict')
-
返回字符串的编码版本;默认情况下,如果出错将抛出
ValueError
,除非提供了 errors
参数为 'ignore' 或 'replace'。
-
endswith(suffix, beg=0, end=len(string))
-
判断字符串或其子字符串(如果提供了开始索引
beg
和结束索引 end
)是否以 suffix
结尾;如果是则返回真,否则返回假。
-
expandtabs(tabsize=8)
-
将字符串中的制表符扩展成多个空格;默认情况下每制表符占用 8 个空格,除非提供了
tabsize
。
-
find(str, beg=0, end=len(string))
-
判断
str
是否出现在字符串或其子字符串中(如果提供了开始索引 beg
和结束索引 end
);如果找到则返回索引,否则返回 -1。
-
-
format_map(mapping)
-
同样用于格式化当前字符串,不同之处在于它使用了一个映射对象。
-
index(str, beg=0, end=len(string))
-
同
find()
,但如果未找到 str
则抛出异常。
-
isalnum()
-
如果字符串至少有一个字符并且所有字符都是字母数字,则返回真,否则返回假。
-
isalpha()
-
如果字符串至少有一个字符并且所有字符都是字母,则返回真,否则返回假。
-
isascii()
-
如果字符串中的所有字符都属于 ASCII 字符集,则返回 True。
-
isdecimal()
-
如果一个 UNICODE 字符串只包含十进制字符,则返回真,否则返回假。
-
-
isidentifier()
-
检查字符串是否是一个有效的 Python 标识符。
-
islower()
-
如果字符串至少有一个大小写的字符并且所有大小写的字符都是小写,则返回真,否则返回假。
-
isnumeric()
-
如果一个 UNICODE 字符串只包含数字字符,则返回真,否则返回假。
-
-
-
istitle()
-
如果字符串正确地“首字母大写”,则返回真,否则返回假。
-
isupper()
-
如果字符串至少有一个大小写的字符并且所有大小写的字符都是大写,则返回真,否则返回假。
-
join(seq)
-
将序列
seq
中元素的字符串表示合并(连接)成一个字符串,使用字符串作为分隔符。
-
ljust(width[, fillchar])
-
返回一个空格填充的字符串,使得原始字符串左对齐并且总长度为
width
列。
-
-
-
maketrans()
-
返回一个用于
translate
函数中的转换表。
-
partition()
-
在首次出现分隔符的地方将字符串分割成三个字符串元组。
-
-
-
replace(old, new [, max])
-
将字符串中所有出现的
old
替换为 new
或者如果提供了 max
则替换最多 max
次。
-
rfind(str, beg=0,end=len(string))
-
rindex( str, beg=0, end=len(string))
-
rjust(width[, fillchar])
-
返回一个空格填充的字符串,使得原始字符串右对齐并且总长度为
width
列。
-
rpartition()
-
在最后一次出现分隔符的地方将字符串分割成三个字符串元组。
-
-
-
split(str="", num=string.count(str))
-
按照分隔符
str
(如果没有提供则为空格)分割字符串并返回子字符串列表;如果提供了 num
,则最多分割 num
个子字符串。
-
splitlines(num=string.count('\n'))
-
按所有(或
num
)换行符分割字符串并返回每一行的列表,移除了换行符。
-
startswith(str, beg=0,end=len(string))
-
判断字符串或其子字符串(如果提供了开始索引
beg
和结束索引 end
)是否以子字符串 str
开头;如果是则返回真,否则返回假。
-
strip([chars])
-
对字符串同时执行
lstrip()
和 rstrip()
。
-
-
title()
-
返回字符串的“首字母大写”版本,即所有单词首字母大写其余小写。
-
translate(table, deletechars="")
-
根据长度为 256 字符的转换表
str
转换字符串,并移除 del
字符串中的字符。
-
-
zfill(width)
-
返回原始字符串左侧补零至总长度为
width
个字符的字符串;意在用于数字,zfill()
保留任何符号(少一个零)。
使用字符串的内置函数
函数描述
-
-
-