第七章 字串

Paperfish24發表於2020-11-14

第七章 字串

1. 字串概述

字串是指包含若干字元的容器結構。字串屬於不可變有序序列,使用單引號、雙引號、三單引號、或三雙引號作為定界符,而且不同的定界符之間可以相互巢狀。

支援序列通用方法(包括雙向索引、比較大小、計算長度、元素訪問、切片、成員測試等操作),還支援一些字串特有的操作方法(字串格式化、查詢、替換、排版等)。不能直接對字串物件進行原色增加、修改與刪除等操作,切片操作也只能訪問其中的元素而無法使用切片來修改字串中的字元。另外,字串物件提供的replace()translate()方法以及大量排版方法也不是隊員字串直接進行修改替換,而是返回一個新字串作為結果。

2. 字串編碼格式

Python預設使用UTF-8編碼格式,完全支援中文。在統計字串長度時,無論是一個數字、英文字母,還是一個漢字,都按一個字元對待和處理。

除了支援Unicode編碼的str型別外,Python還支援位元組串型別bytes,str型別可以通過encode()方法使用指定的字串編碼格式編碼成為bytes物件,而bytes物件則可以通過decode()方法使用指定的編碼格式解碼成為str字串。

>>> type('python是個好語言')
<class 'str'>
>>> type('python是個好語言'.encode('gbk'))		#編碼為位元組串,採用gbk編碼格式
<class 'bytes'>

3. 轉義字元與原始字串

轉義字元是指,在字串中某些特定的符號前加一個斜線之後,該字元將被解釋為另外一種含義,不再表示本來的字元。

轉義字元含義
\b退格,把游標移動到前一列的位置
\f換頁符
\n換行符
\r回車
\t水平製表符
\v垂直製表符
\\一個斜線\
\'單引號’
\"雙引號"
\ooo3位八進位制數對應的字元
\xhh2位十六進位制對應的字元
\uhhhh4位十六進位制數表示的Unicode字元
>>> from time import sleep
>>> for i in range(10):
	print(i, end = '\r')
	sleep(0.1)

	
0
1
2
3
4
5
6
7
8
9

為了避免對字串中的轉義字元進行轉義,可以使用原始字串(是指在字串前面加上rR表示原字串,其中所有字元都是原始的含義而不轉義)。

>>> path = r'C:\Windows\Hello\notme'

4. 字串格式化

1. 使用%符號進行格式化

% [-] [+] [0] [m] [.n] 格式字元 % x
1  2   3   4   5    6      7   8  9
1. 格式標誌,表示格式開始
2. 指定左對齊輸出
3. 對正數加正號
4. 指定空位填0
5. 指定最小寬度
6. 指定精度
7. 指定型別
8. 格式運算子
9. 待轉換的表示式
格式字元說明
%s格式化為字串
%c單個字元
%d, %i十進位制整數
%o八進位制整數
%x十六進位制整數
%e指數(基底寫為e)
%E指數(基底寫為e)
%f, %F浮點數
%g指數(e)或浮點數(根據顯示長度)
%G指數(E)或浮點數(根據顯示長度)
%%格式化為一個%符號

使用此方式格式化字串時,要求被格式化的內容和格式字元之間的數量和順序都一一對應。

>>> x = 1234
>>> "%o" % x
'2322'
>>> '%e' % x
'1.234000e+03'
>>> '%d, %c' % (65, 68)				#格式化元組,一一對應
'65, D'
>>> '%s' % set(range(5))			#集合格式化為字串
'{0, 1, 2, 3, 4}'

2. 使用format()方法進行字串格式化

不要求待格式化的內容和格式字元之間的順序嚴格一致。該方法中可以使用的格式主要有b(二進位制格式)、c(把整數轉換為Unicode字元)、d(十進位制格式)、o(八進位制格式)、x(小寫十六進位制格式)、X(大寫十六進位制格式)、e/E(科學計數法格式)、f/F(固定長度的浮點數格式)、%(使用固定長度浮點數顯示百分數)。

5. 字串常用方法與操作

1. find()、rfind()、index()、rindex()、count()

find()rfind()用來查詢一個字串在另一個字串指定範圍(預設是整個字串)中首次和最後一次出現的位置,不存在返回-1。

index()rindex()用來返回一個字串在另一個字串指定範圍中首次和最後一次出現的位置,不存在丟擲異常。

count()用來返回一個字串在另一個字串中出現的次數,不存在則返回0。

>>> s = 'apple, peach, pineapple,orange'
>>> s.find('pe')
7
>>> s.find('pe', 10)
-1
>>> s.find('pine', 7, 15)
-1
>>> s.rfind('pe')
7
>>> s.index('pine', 7, 15)				#index和find的使用方法類似
ValueError: substring not found

>>> s.count('apple')
2

2. split()、rsplit()、partition()、rpartition()

split()rsplit()用來以指定字元作為分隔符,從字串左端和右端開始將其分割為多個字串,並返回包含分隔結果的列表。如果不指定分隔符,則字串中的任何空白符號(包括空格、換行符、製表符等)的連續出現都將被認為是分隔符,並且自動刪除字串兩側空白字元,返回包含最終分隔結果的列表。此外,還支援最大分隔次數。

>>> s = 'apple, peach, pineapple, orange'
>>> s.split(',')
['apple', ' peach', ' pineapple', ' orange']

>>> str = 'Hello I am Jack'				#以空白字元作為分隔符
>>> str.split()
['Hello', 'I', 'am', 'Jack']
>>> str = 'hello i am\t\tjack'			#\t也是空白字元
>>> str.split()
['hello', 'i', 'am', 'jack']

>>> s.split(maxsplit = 2)						#分隔兩次
['apple,', 'peach,', 'pineapple, orange']
>>> s.split(maxsplit = 10)						#當分隔次數大於實際可分隔次數時,自動忽略此引數
['apple,', 'peach,', 'pineapple,', 'orange']

partition()rpartition()用來以指定的字串為分隔符將字串分隔為三部分,分別是指定字串之前部分,指定字串和指定字串之後的部分。如果指定字串不在原字串中,則返回原字串和兩個空字串。若含有多個指定字串,則選擇第一個遇到的指定字串開始分隔,rpartition()用來從右邊開始找。

>>> s = 'apple, peach, pineapple, orange'
>>> s.partition(',')
('apple', ',', ' peach, pineapple, orange')

3. join()

用來將列表中的多個字串進行連線,並在相鄰的兩個字串之間插入指定字元,返回新字串。

>>> s = ['apple', 'peach', 'pear', 'banana']
>>> ','.join(s)
'apple,peach,pear,banana'

#利用split和join可完成字串中多餘空格的去除
>>> s = 'apple      pear   banana'
>>> ' '.join(s.split())			#先用空格分為一個字串列表,在在其中加入空格
'apple pear banana'

4. lower()、upper()、capitalize()、title()、swapcase()

分別是將字串轉換為小寫字串、轉換為大寫字串、將字串首字母變為大寫(其餘變是小寫)、將每個單詞的首字母變為大寫、大小寫互換。

5. replace()、maketrans()、translate()

用來替換字串中指定字元或子字串的所有重複出現,每次只能替換一個字元或一個字串,把指定的字串引數作為一個整體對待,類似於Word中的查詢與替換功能。不修改原字串,返回一個新的字串。

>>> s = 'apple pear banana'
>>> s.replace('apple', 'peach')
'peach pear banana'

maketrans()用來生成字元對映表,而translate()用來根據對映表中定義的對應關係轉換字串並替換其中的字元。


6. strip()、rstrip()、lstrip()

用來刪除兩端、右端或者左端連續的空白字元或指定字元。指定引數時的字串並不作為一個整體,而是在原字串的兩側、右側和左側刪除引數字串中包含的所有字元,一層一層的從外往裡扒。

>>> 'aabbccaaccbbaa'.strip('ab')
'ccaacc'>>> '\n\nhello world     \n\n'.strip()
'hello world'
>>> 'aaaassdfgg'.strip('a')
'ssdfgg'
>>> 'aaaassfdefdsaaa'.rstrip('a')
'aaaassfdefds'
>>> 'aaaassfdefdsaaa'.lstrip('a')
'ssfdefdsaaa'

>>> 'aabbccddeeeffggga'.strip('abcdefg')		#判斷最外層字元是不是指定字串中字元
''
>>> 'aabbccddeeeffggga'.strip('de')				#如果不是,就返回原字串
'aabbccddeeeffggga'
>>> 'aabbccaaccbbaa'.strip('ab')				#如果是,就刪除掉,然後再看下一段
'ccaacc'

7. startswith()、endswith()

用來判斷字串是否以指定字串開始或結束,可以接收兩個整數引數來限定字串的檢測範圍。此外,還可以接收一個字串元組作為引數來表示字首或字尾。

>>> s = 'Beautiful is better than ugly'
>>> s.startswith('Be')					#判斷是否是以'Be'開頭
True
>>> s.startswith('Be', 5)				#指定起始位置
False
>>> s.startswith('is', 10, 12)			#指定起始和結束位置
True

>>> import os						#可組合起來用於檔名篩選,如下實現e盤中檔名篩選輸出
>>> [filename for filename in os.listdir(r'E:\\') if filename.endswith(('.txt', '.TXT', '.exe'))]
['Key.TXT', 'magic.TXT', 'test.txt']

8. isalnum()、isalpha()、isdigit()、isspace()、isupper()、islower()

用來測試字串是否是數字或字母、是否為子母、是否為整數字符(注意不能測試浮點數)、是否為空白字元、是否為大寫字母及是否為小寫字母。

9. center()、ljust()、rjust()

用於對字串進行排版,其中center()ljust()rjust()返回指定寬度的字串,原字串居中、左對齊或右對齊出現在新字串中,如果指定的寬度大於字串長度,則使用指定的字元(預設是空格)進行填充。

>>> 'main menu'.center(20)
'     main menu      '
>>> 'main menu'.center(20, '-')			#居中對齊,填充'-'
'-----main menu------'
>>> 'main menu'.ljust(20, '#')			#左對齊,填充'#'
'main menu###########'

10. 字串支援的運算子

+連線字串,*表示字串重複,in用來判斷一個是否出現在另一個字串中(in左邊的作為一個整體看待)。

11. 適用於字串的內建函式

len()用於求字串長度、max()用於找最大字元、min()用於找最小字元、zip()可以作用於字串(一一對應的元組)、sorted()對所有的字元進行排序,返回一個列表、reversed()翻轉字串、enumerate()列舉字串、map()用於對相應字串作用函式。

12. 字串切片

僅限於讀取其中字串,不可修改或刪除。

6. 字串常量

標準庫string提供了英文字母大小寫、數字字元、標點符號等常量,可以直接使用

7. 中英文分詞

擴充套件庫jieba和snownlp很好地支援了中文分詞,可以使用pip命令進行安裝。在自然語言處理領域經常需要對文字進行分詞,分詞的準確程度直接影響了後續文字處理和挖掘演算法的最終效果。

8. 漢字到拼音的轉換

擴充套件庫pypinyin支援漢字到拼音的轉換,而且可以和分詞擴充套件庫配合使用。

相關文章