User:Xyy23330121/Python/字符串
本早在第一章就接触过了字符串,在本章,我们将进一步学习对字符串的一些操作。
我们之前提到过,字符串是前后以单引号'
或双引号"
括住的文本内容。比如以下的方式:
a = "示例字符串A"
print(a) #输出:示例字符串A
b = '示例字符串B'
print(b) #输出:示例字符串B
c = ''
print(c) #不包含字符的空字符串,输出仅仅是一个空行。
我们接下来介绍一些其它方法。
用连续的三个单引号,或连续的三个双引号括起来的字符串为多行字符串。我们看以下示例:
if True:
a = '''多行
字符
串'''
b = """多
行字符串"""
print(a)
print(b)
输出:
多行
字符
串
多
行字符串
语句组对缩进比较严格,但多行字符串不同。多行字符串不需要缩进,它会把行首的空格和行尾的换行符都作为字符保存在字符串里面。
Python 可以把字符串直接作为语句,从而可以作为注释。多行字符串因此也常用于多行注释,比如:
'''
注释
注释
'''
"""
注释
注释
"""
一个字符串可以包含很多字符,当字符串过长时,整段代码都会很难阅读。编辑器一般是不会进行自动换行的,因此,长字符串在编辑器中显示的效果会像这样:
这对于在编辑器中修改字符串内容、尤其是字符串末尾内容造成了非常大的不方便。Python 提供了多种方法来解决这个问题。
Python 会将相邻的两个字符串自动拼接。比如:
a = "1" "2" #等同于:a = "12"
利用这个特性,以及我们之前讨论语句组和缩进时提到过的、括号的作用。可以做到:
if True:
print("哼 哼 哼啊啊啊啊啊啊啊啊啊啊啊啊啊"
"啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊"#注释
"啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊"
"啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊"
"啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊"
"啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊"
"啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊"
"啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊")
当一行代码过长时,我们可以在行尾添加反斜杠\
来忽略换行符。和括号相同,此时下一行代码和上一行的代码会被视为是在同一行。
if True:
a = "1"\
"2" #等同于:a = "12"
b = 1\
+ 2 #等同于:b=1 + 2
一定要注意,反斜杠必须在行尾最末端——连空格都不能有,因此需要添加反斜杠的行是无法添加注释的。这和括号的方法是不一样的。比如,以下代码会报错:
b = 1\#在这里添加注释的话,就会报错。
+ 2
由于视觉上很难查出反斜杠后面有没有空格,在防止出错以及添加注释的方面,括号是更好用的方式。
和前面学到过的int
对象和int
函数相似。也可以用str
函数生成字符串对象。str
函数生成的字符串在一般情况下和print
函数输出的内容一模一样。
print(str(1))
print(1)
str
函数支持将几乎任何类型转化为字符串。其用法和int
函数是完全类似的。不再赘述。
转义字符 | 含义 |
---|---|
\ |
(用在行末)取消接下来的回车。 |
\\ |
倒斜杠(\) |
\' |
单引号(') |
\" |
双引号(") |
\a |
响铃(BEL) |
\b |
退格(BS) |
\f |
换页(FF) |
\n |
换行(LF) |
\r |
回车(CR) |
\t |
横向制表符(TAB) |
\v |
纵向制表符(VT) |
\ooo |
八进制数ooo 所表示的字符
|
\xhh |
二位十六进制数hh 所表示的字符
|
\N{name} |
Unicode 数据库中,名为name 的字符,name 可以为别名。有些别名不被支持。
|
\uxxxx |
四位十六进制数xxxx 所表示的字符
|
\Uxxxxxxxx |
八位十六进制数xxxxxxxx 表示的字符
|
在创建字符串时,有的字符不方便被直接放在字符串里。比如,如果我们希望字符串中的文本是"Let's go!", he said.
,如果把它直接放在引号里面,它就会变成:
'"Let's go!", he said.'
""Let's go!", he said."
很显然这是会报错的。为了应对这些字符,我们有转义字符。所有转义字符的列表见右表。
参照右边的列表,为了输入引号,我们把上面的内容改写为:
'"Let\'s go!", he said.'
"\"Let's go!\", he said."
此时就不会报错。
我们将在下面讨论几个特殊的转义字符。
由于多行字符串首行依旧需要缩进,上面示例的多行字符串并不容易阅读。但是如果用:
if True:
b = """
多
行字符串"""
又会在字符串开头留下一个换行符。对此,Python 提供了一个解决方法:
if True:
b = """\
多
行字符串"""
我们可以用这种转义方法“消灭”掉多行字符串中的换行符,以保证代码美观易读。
这种方法也可以用于单行字符串:
if True:
b = "单行\
字符串"
也是合法的。与之前的讨论相同,此时,在行尾使用了\
的行,不能在后面添加注释。
转义字符列表中,比如 \ooo
等,都是按 Unicode 码表中的字符码位来表示的。比如,我们查到 U+0026 是 &
字符。我们就可以用以下几种方式输出 &
字符:
print('\046') #三位八进制数字,046对应的就是十六进制的26
print('\x26') #二位十六进制数字
print('\u0026') #四位十六进制数字
print('\U00000026') #八位十六进制数字
关于 Unicode 码表,可以查阅维基百科的Unicode码表页面。
除上述方法与 Unicode 有关以外, \N{name}
也和 Unicode 有关。依旧用上面的 &
字符。我们在 Unicode 标准中查到该字符的名称是 AMPERSAND ,于是以下方式也可以输出 &
字符:
print('\N{AMPERSAND}')
字符串支持两种运算:字符串之间的加法和字符串与整数的乘法。我们看以下示例:
print('AB' * 3) #ABABAB
print('AB' + 'BA') #ABBA
print('A' * 3 + "b") #AAAb
字符串之间的加法会返回两个字符串按顺序拼接后的字符串。而字符串和整数n
的乘法会将字符串自身重复 n 次。
我们可以通过“索引”来提取字符串中的一部分。比如:
string = "python"
print(string[0]) #输出:p
print(string[-1]) #输出:n
print(string[1:3]) #输出:yt
print(string[:3]) #输出:pyt
print(string[5:]) #输出:n
如果以整数为索引,Python 会输出字符串中对应索引位置的单一字符组成的字符串。以上面字符串为例,以下表格可能会对整数索引有所帮助:
顺序 | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
字符串 | p | y | t | h | o | n |
逆序 | -6 | -5 | -4 | -3 | -2 | -1 |
根据上表,"python"[2]
和"python"[-4]
的结果都是't'
。
任何超出字符串长度的下标都会报错,比如"python"[6]
会报错:
IndexError: string index out of range
格式类似 start:end
的索引会返回从 start
到 end
范围内的字符组成的子字符串。以下拓展后的表格可能会对此类索引有所帮助:
顺序 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|
字符串 | p | y | t | h | o | n | |
逆序 | -6 | -5 | -4 | -3 | -2 | -1 |
若以 -5: 4
为索引,就会输出从索引为 -5 开始,到索引为 4 为止的子字符串 "yth"
(不包含索引为 4 的 "o"
)。
与整数索引不同,这里 start
和 end
可以是任意整数,比如:
- 若以
-7: 13
为索引,就会输出完整的字符串"python"
。 - 若以
2: -6
为索引,就会输出空字符串""
。
同时,可以不输入 start
或 end
,比如:
- 若以
2:
为索引,就会从索引为 2 开始,一直到结尾的子字符串"thon"
。 - 若以
:-4
为索引,就会输出从字符串的开头开始,一直到索引为 -4 的子字符串"py"
。 - 若以
:
为索引,就会输出完整的字符串"python"
。
slice 索引还支持以start:end:step
的格式输入第三个非 0 整数step
。比如:
- 若以
1:6:2
为索引,就会输出由索引为 1、3、5 的字符构成的字符串"yhn"
。 - 若以
6:1:-2
为索引,由于索引为 6 的字符不存在,向下找最接近的字符,即索引为 5 的n
。输出由索引为 5、3 的字符构成的字符串"nh"
。
加入 step
之后,start
或 end
依旧可以省略。若 step > 0
,且不输入 start
,则相当于使用 start = 0
。若 step < 0
且不输入 start
,则相当于使用 start = -1
。
step
也是可以省略的,比如设置索引为 ::
。此时,默认step = 1
。
原始字符串是另一种创建字符串的方法。用这种方法创建的字符串,其中的内容都不会被转义。使用原始字符串的方法,是在字符串的引号前加入r
或者R
,比如:
print(r'C:\Users\Public')
print(r"C:\Users\Public")
print(R'''C:\Users\Public''')
print(r"""C:\Users\Public""")
运行的结果为:
C:\Users\Public
C:\Users\Public
C:\Users\Public
C:\Users\Public
可以看出,其中所有的反斜杠\
都没有参与转义。这种方法有一个限制:原始字符串不能以奇数个\
字符结束。为此,我们有一些绕过它的方法:[1]
print('C:\\this\\will\\work\\') #不使用原始字符串
print(r'C:\this\will\work' '\\') #相邻字符串自动拼接
如果读者读了本章上面列出来的文档,会发现除了 r
之外,还有 u
、f
、rf
(等同于 fr
)和 b
、br
(等同于 rb
)几种字符可以用作前缀。关于b
用作前缀的情况,参见之后的选学章节。关于 f
、rf
用作前缀的情况,参见格式化字符串章节。
u
用作前缀的情况来自于 Python 2.x 版本。之所以支持 u
用作前缀,只是为了方便将代码从 Python 2.x 升级到 Python 3,读者不必学习这些过时代码。