Python基礎與拾遺2:Python中的字串與字串格式化
- 常見的字串常量與運算式
- 字串轉義
- 索引和分片
- 原處修改字串
- 字串格式化
- 格式化運算式
- 格式化呼叫方法
- 添加具體格式化
本篇博文,講解Python中常用的字串與字串格式化操作,下面開始干貨,
常見的字串常量與運算式
| 操作 | 解釋 |
|---|---|
| s = ‘’ | 空字串 |
| s = “spam’s” | 普通字串,單雙引號相同 |
| S = ‘s\np\ta\x00m’ | 轉義序列 |
| s = “”"…""" | 三重引號字串塊 |
| s = r’\temp\spam’ | Raw字串 |
| S = b’spam’ | Python 3.0及之后版本中的位元組字串 |
| s = u’spam’ | Python 2.6及之后版本使用的Unicode字串 |
| s1 + s2 | 合并 |
| s * 3 | 重復 |
| s[i] | 索引 |
| s[i:j] | 分片 |
| len(s) | 求長度 |
| “a %s parrot” % kind | 字串格式化運算式 |
| “a {0} parrot”.format(kind) | Python 2.6及之后版本與Python 3.0及之后版本中的字串格式化方法 |
| a.find(‘pa’) | 字串方法呼叫:搜索 |
| s.rstrip() | 移除空格 |
| s.replace(‘pa’, ‘xx’) | 替換 |
| s.split(’,’) | 用展位符分隔 |
| s.isdigit() | 內容測驗(這里是測驗是否為數字組成的字串) |
| s.lower() | 大寫轉小寫 |
| S.endswith(‘spam’) | 結束字符測驗 |
| ‘spam’.join(strlist) | 插入分隔符 |
| S.encode(‘latin-1’) | 編碼 |
| for x in S: print(x) | 迭代 |
| ‘spam’ in S | 成員關系判斷 |
| [c * 2 for c in S] | 字串決議 |
| map(ord, S) | 函式映射 |
- 單雙引號字串相同,在Python中,沒有像c語言一樣的字符的概念,單引號與雙引號表示一樣的字串,
- 任意相鄰的字串會被合并,
a = "abcd"'efg' # 'abcdefg'
- 在Python 2.6及之后的版本中,字串前加u為Unicode字串,表示寬Unicode文本;否則為str字串,表示8位文本和二進制資料,
- 在Python 3.0及之后的版本中,字串前加b為Byte字串,表示二進制資料,變體為bytearray;否則為Unicode文本,3和4中的兩者,在普通的任務中較少使用,
- 在上表中,僅列舉了有限的字串方法,若需查詢所有的字串方法,可以參閱Python手冊,
字串轉義
‘\’后面的一個或多個字符,在最終的字串中會被單個字符所替代,
| 轉義 | 意義 |
|---|---|
| \newline | \后面另起一行,表示連續 |
| \ | 反斜杠(保留\字符) |
| ’ | 單引號(保留‘字符) |
| " | 雙引號(保留"字符) |
| \a | 響鈴 |
| \b | 倒退 |
| \f | 換頁 |
| \n | 新行(換行) |
| \r | 回傳 |
| \t | 水平制表符 |
| \v | 垂直制表符 |
| \N{id} | Unicode資料庫id |
| \uhhhh | Unicode 16位的十六進制值(必須有四個十六進制位h) |
| \uhhhhhhhh | Unicode 32位的十六進制值(必須有八個十六進制位h) |
| \xhh | 十六進制值(必須有兩個十六進制位h) |
| \ooo | 八進制值(必須至少有一個八進制位o,至多三個) |
| \0 | 空字符(注意與空格不同) |
| \other | 不轉義(保留原字符) |
- \u后面必須接4個16進制位,\U后面必須接8個十六進制位,合起來是16進制值表示的一個字符,\u和\U只能用于Unicode常量之中,
- \x后面必須接2個16進制位,合起來是16進制值表示的一個字符,
s = 'abc\xFF' # 'abc?'
s = 'abc\xF' # SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 3-5: truncated \xXX escape
- \后面可接至少一個8進制位,最多會查找至3個八進制位,合起來是8進制值表示的一個字符,
注意,如果接的不是八進制位,那么\會自動轉化成\,代表’'字符;\不能單獨結尾,
s = 'abc\6' # 'abc\x06'
s = 'abc\11' # 'abc\t'
s = 'abc\555' # 'abc?'
s = 'abc\2222222' # 'abc\x9b333333''
s = 'abc\ABC' # 'abc\\ABC'
s = 'abc\' # SyntaxError: EOL while scanning string literal
- \0與’ ‘(空格字串)不相同,
- r關閉轉義
# 下述兩個字串相同
'C:\\MyFile\\'
r'C:\MyFile\'
- 三重引號表示字串塊,常用于代碼中大段注釋,
索引和分片
- 索引可為正也可為負,從左至右時,0為第一個元素;從右至左時,-1為第一個元素,
- 分片操作會回傳一個新的物件,
- 分片操作有步進值,S[I:J:K]中,K就是步進值,可以為負數,不能為0,步進值表示每隔多少個元素提取一次,注意,步進值為負數時,I需大于J,分片操作中,[::-1]表示倒序,較常用,
a = 'abcdefghijklmn'
a[0:5] # 'abcde'
a[5:0] # ''
a[0:6:2] # 'ace'
a[9:5:-3] # 'jg'
a[::-1] # 'nmlkjihgfedcba'
原處修改字串
- replace()函式,
- 先將字串轉換成串列,再修改串列,最后使用join方法進行合并,
S = 'abcdefg'
L = list(S)
L[0] = 'x'
L[1] = 'y'
S = ''.join(L) # 'xycdefg'
字串格式化
格式化運算式
- 在%運算子的左側放置一個需要進行格式化的字串,這個字串帶有一個或多個嵌入的轉換目標,都以%開頭,
- 在%運算子右側放置一個(或多個,嵌入到元祖中)物件,這些物件將會插入到左側想讓Python進行格式化字串的一個(或多個)轉換目標的位置上去,
- 由于字串的性質,格式化會回傳新的字串,而不是對原字串進行修改,
| 代碼 | 意義 |
|---|---|
| s | 字串(或任何物件) |
| r | 同s,但使用repr,而不是str |
| c | 字符 |
| d | 十進制(整數) |
| i | 整數 |
| u | 無號(整數) |
| o | 八進制整數 |
| x | 十六進制整數 |
| X | 同x,但列印大寫 |
| e | 浮點整數,使用科學計數法表示,默認保存小數點后六位 |
| E | 同e,但列印大寫 |
| f | 浮點十進制,默認保存小數點后六位 |
| F | 浮點十進制,默認保存小數點后六位 |
| g | 浮點e或者f,根據數的大小決定(太小或太大就使用科學計數法,否則直接使用浮點數) |
| G | 浮點E或者f,根據數的大小決定(太小或太大就使用科學計數法,否則直接使用浮點數) |
| % | 常量% |
- 標準的運算式
%[(name)][flags][width][.precision]typecode
name放置一個字典的鍵,
'%(n)d | %(x)s' % {"n":1, "x":"spam"} # '1 | spam'
flags中“-”表示左對齊,"+"表示保留正負號,“0"表示補零,”#"后接o或者x表示八進制或者十六進制,
x = 1.23456789
'%-6.2f | %05.2f | %+06.1f' % (x, x, x) # '1.23 | 01.23 | +001.2'
x = 123456789
'%#o | %#x' % (x, x) # '0o726746425 | 0x75bcd15'
width和precision可編碼為一個"*",指定它們應該從輸入值的下一項取值,
x = 1.23456789
'%*.*f' % (7, 4, x) # ' 1.2346'
- g和G的顯示浮點數或科學計數法,取決于資料大小,
'%g | %g | %g | %G | %G | %G' % (1.23456, 0.00000000000123456, 12345600000000, 1.23456, 0.00000000000123456, 12345600000000) # '1.23456 | 1.23456e-12 | 1.23456e+13 | 1.23456 | 1.23456E-12 | 1.23456E+13'
格式化呼叫方法
- 在Python 2.6及之后的版本中與Python 3.0及之后的版本中,使用新的字串物件的format方法,使用主體字串作為模板,并且接受任意多個表示將要根據模板替換的值的引數,花括號通過位置指出替換的目標及將要插入的引數,
'{motto}, {0} and {food}'.format(32, motto=3.14 , food=[1,2]) # '3.14, 32 and [1, 2]'
- 添加鍵,屬性和偏移量,方括號指定字典鍵,點表示位置或關鍵字所參考的一項物件屬性,
import sys
'My {1[spam]} runs {0.platform}'.format(sys, {'spam': 'laptop'}) # 'My laptop runs win32'
格式化字串中的方括號可以指定串列(及其他序列)偏移量以執行索引,但注意只有單個的正的偏移才能在格式化字串中的語法中有效,要指定負的偏移或分片,或者使用任意運算式,必須在格式化自身之外運行運算式,
somelist = list('SPAM')
'first={0[0]}, third={0[2]}'.format(somelist) # 'first=S, third=A'
'first={0}, last={1}'.format(somelist[0], somelist[-1]) # 'first=S, last=M'
parts = somelist[0], somelist[-1], somelist[1:3]
'first={0}, last={1}, middle={2}'.format(*parts) # "first=S, last=M, middle=['P', 'A']"
添加具體格式化
格式化標準格式
{format!conversionflag:formatspec}
fieldname是指定引數的一個數字或關鍵字,后面跟著可選的".name"或"[index]"成分參考,以上第2點的例子說明了這種情況,
conversionflag可以是r,s或者a,分別是在該值上對repr,str或ascii內置函式的一次呼叫,該點使用較少,
formatspec指定了如何表示該值,包括字符寬度,對齊方式,補零,小數點精度等細節,并且以一個可選的資料型別編碼結束,組成形式上描述如下:
[[fill]align][sign][#][0][width][.precision][typecode]
align可能是<, >, =或^,分別表示左對齊,右對齊,一個標記字符后的補充或居中對齊,可以結合fill值進行填充,
'{0:<10.2f}'.format(1.234) # '1.23 '
'{0:>10.2f}'.format(1.234) # ' 1.23'
'{0:^10.2f}'.format(1.234) # ' 1.23 '
'{0:7<10.2f}'.format(1.234) # '1.23777777'
'{0:7>10.2f}'.format(1.234) # '7777771.23'
'{0:7^10.2f}'.format(1.234) # '7771.23777'
'{0:7=+10.2f}'.format(1.234) # '+777771.23'
'{0:7<+10.2f}'.format(1.234) # '+1.2377777'
'{0:7>+10.2f}'.format(1.234) # '77777+1.23'
'{0:7^+10.2f}'.format(1.234) # '77+1.23777'
formatspec也包含嵌套的,只帶有{}的格式化字串,它從引數串列動態地獲取值(和格式化串列中的*很相似),
比如,{0:10}意味著一個10字符寬的欄位中的第一個位置引數,{1:<10}意味著第2個位置引數在一個10字符寬度欄位中左對齊,{0.platform:>10}意味著第一個引數的platform屬性在10字符寬度的欄位中右對齊,
'{0:10} = {1:10}'.format('spam', 123.4567) # 'spam = 123.4567'
'{0:>10} = {1:<10}'.format('spam', 123.4567) # ' spam = 123.4567 ''{0.platform:>10} = {1[item]:<10}'.format(sys, dict(item='laptop')) # ' win32 = laptop '
在格式化方法呼叫中,浮點數支持與%運算式中相同的型別代碼和格式化宣告,例如{2:g}表示,第三個引數默認地根據’g’浮點數表示格式化,{1:.2f}指定了帶有兩個小數位的"f"浮點數格式,{2:06.2f}添加一個6字符寬度的欄位并且在左邊補充0,
'{0:e}, {1:.3e}, {2:g}'.format(3.14159, 3.14159, 3.14159) # '3.141590e+00, 3.142e+00, 3.14159'
'{0:f}, {1:.2f}, {2:06.2f}'.format(3.14159, 3.14159, 3.14159) # '3.141590, 3.14, 003.14'
格式化方法也支持十六進制,八進制與二進制格式,實際上,字串格式化方法是把整數格式化為指定的進制的某些內置函式的替代方法,
'{0:X}, {1:o}, {2:b}'.format(255, 255, 255) # 'FF, 377, 11111111'
格式化引數可以在格式化字串中硬編碼,或者通過嵌套的格式化語法從引數串列動態地獲取,后者很像是格式化運算式中的星號語法,
'{0:.2f}'.format(1 / 3.0) # '0.33'
'%.2f' % (1 / 3.0) # '0.33'
'{0:.{1}f}'.format(1 / 3.0, 4) # '0.3333'
'%.*f' % (4, 1 / 3.0) # '0.3333'
在Python 2.6及之后的版本中與Python 3.0及之后的版本中還提供了一種新的內置format函式,用來格式化一個單獨的項,通過運行主體物件方法__format__實作,
'{0:.2f}'.format(1.2345) # '1.23'
'%.2f' % 1.2345 # '1.23'
format(1.2345, '.2f') # '1.23'
以上,歡迎各位讀者朋友提出意見或建議,
歡迎閱讀筆者后續博客,各位讀者朋友的支持與鼓勵是我最大的動力!
written by jiong
大道至簡,知易行難,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/256382.html
標籤:python
上一篇:【python】matplotlib畫圖設定漢字、軸標簽、刻度線內向、添加圖例
下一篇:LQBv22-Python:擴散
