用户:Xyy23330121/Python/字符串


本早在第一章就接触过了字符串,在本章,我们将进一步学习对字符串的一些操作。

创建字符串

编辑

我们之前提到过,字符串是前后以单引号'或双引号"括住的文本内容。比如以下的方式:

a = "示例字符串A"
print(a)           #输出:示例字符串A
b = '示例字符串B'
print(b)           #输出:示例字符串B
c = ''
print(c)           #不包含字符的空字符串,输出仅仅是一个空行。

我们接下来介绍一些其它方法。

多行字符串

编辑

用连续的三个单引号,或连续的三个双引号括起来的字符串为多行字符串。我们看以下示例:

if True:
    a = '''多行
     字符
    串'''
    b = """多
行字符串"""
print(a)
print(b)

输出:

多行
     字符
    

行字符串

语句组对缩进比较严格,但多行字符串不同。多行字符串不需要缩进,它会把行首的空格和行尾的换行符都作为字符保存在字符串里面。

用作注释

编辑

Python 可以把字符串直接作为语句,从而可以作为注释。多行字符串因此也常用于多行注释,比如:

'''
注释
注释
'''
"""
注释
注释
"""

长字符串的美观写法

编辑

一个字符串可以包含很多字符,当字符串过长时,整段代码都会很难阅读。编辑器一般是不会进行自动换行的,因此,长字符串在编辑器中显示的效果会像这样:

print("哼 哼 哼啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊")

这对于在编辑器中修改字符串内容、尤其是字符串末尾内容造成了非常大的不方便。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 = "单行\
字符串"

也是合法的。与之前的讨论相同,此时,在行尾使用了\的行,不能在后面添加注释。

Unicode 字符

编辑

转义字符列表中,比如 \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

slice索引

编辑

格式类似 start:end 的索引会返回从 startend 范围内的字符组成的子字符串。以下拓展后的表格可能会对此类索引有所帮助:

顺序 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")。

与整数索引不同,这里 startend 可以是任意整数,比如:

  • 若以 -7: 13 为索引,就会输出完整的字符串"python"
  • 若以 2: -6 为索引,就会输出空字符串""

同时,可以不输入 startend ,比如:

  • 若以 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 之后,startend 依旧可以省略。若 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 之外,还有 ufrf(等同于 fr )和 bbr(等同于 rb )几种字符可以用作前缀。关于b 用作前缀的情况,参见之后的选学章节。关于 frf 用作前缀的情况,参见格式化字符串章节。

u 用作前缀的情况来自于 Python 2.x 版本。之所以支持 u 用作前缀,只是为了方便将代码从 Python 2.x 升级到 Python 3,读者不必学习这些过时代码。

参考文献

编辑