使用者: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,讀者不必學習這些過時代碼。

參考文獻[編輯 | 編輯原始碼]