主頁 > 後端開發 > Python基礎與拾遺2:Python中的字串與字串格式化

Python基礎與拾遺2:Python中的字串與字串格式化

2021-02-04 13:19:02 後端開發

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)函式映射
  1. 單雙引號字串相同,在Python中,沒有像c語言一樣的字符的概念,單引號與雙引號表示一樣的字串,
  2. 任意相鄰的字串會被合并,
a = "abcd"'efg' # 'abcdefg'
  1. 在Python 2.6及之后的版本中,字串前加u為Unicode字串,表示寬Unicode文本;否則為str字串,表示8位文本和二進制資料,
  2. 在Python 3.0及之后的版本中,字串前加b為Byte字串,表示二進制資料,變體為bytearray;否則為Unicode文本,3和4中的兩者,在普通的任務中較少使用,
  3. 在上表中,僅列舉了有限的字串方法,若需查詢所有的字串方法,可以參閱Python手冊,

字串轉義

‘\’后面的一個或多個字符,在最終的字串中會被單個字符所替代,

轉義意義
\newline\后面另起一行,表示連續
\反斜杠(保留\字符)
單引號(保留‘字符)
"雙引號(保留"字符)
\a響鈴
\b倒退
\f換頁
\n新行(換行)
\r回傳
\t水平制表符
\v垂直制表符
\N{id}Unicode資料庫id
\uhhhhUnicode 16位的十六進制值(必須有四個十六進制位h)
\uhhhhhhhhUnicode 32位的十六進制值(必須有八個十六進制位h)
\xhh十六進制值(必須有兩個十六進制位h)
\ooo八進制值(必須至少有一個八進制位o,至多三個)
\0空字符(注意與空格不同)
\other不轉義(保留原字符)
  1. \u后面必須接4個16進制位,\U后面必須接8個十六進制位合起來是16進制值表示的一個字符,\u和\U只能用于Unicode常量之中,
  2. \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
  1. \后面可接至少一個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
  1. \0與’ ‘(空格字串)相同
  2. r關閉轉義
# 下述兩個字串相同
'C:\\MyFile\\'
r'C:\MyFile\'
  1. 三重引號表示字串塊,常用于代碼中大段注釋,

索引和分片

  1. 索引可為正也可為負,從左至右時,0為第一個元素;從右至左時,-1為第一個元素,
  2. 分片操作會回傳一個新的物件,
  3. 分片操作有步進值,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'

原處修改字串

  1. replace()函式,
  2. 先將字串轉換成串列,再修改串列,最后使用join方法進行合并,
S = 'abcdefg'
L = list(S)
L[0] = 'x'
L[1] = 'y'
S = ''.join(L) # 'xycdefg'

字串格式化

格式化運算式

  1. 在%運算子的左側放置一個需要進行格式化的字串,這個字串帶有一個或多個嵌入的轉換目標,都以%開頭,
  2. 在%運算子右側放置一個(或多個,嵌入到元祖中)物件,這些物件將會插入到左側想讓Python進行格式化字串的一個(或多個)轉換目標的位置上去,
  3. 由于字串的性質,格式化會回傳新的字串,而不是對原字串進行修改,
代碼意義
s字串(或任何物件)
r同s,但使用repr,而不是str
c字符
d十進制(整數)
i整數
u無號(整數)
o八進制整數
x十六進制整數
X同x,但列印大寫
e浮點整數,使用科學計數法表示,默認保存小數點后六位
E同e,但列印大寫
f浮點十進制,默認保存小數點后六位
F浮點十進制,默認保存小數點后六位
g浮點e或者f,根據數的大小決定(太小或太大就使用科學計數法,否則直接使用浮點數)
G浮點E或者f,根據數的大小決定(太小或太大就使用科學計數法,否則直接使用浮點數)
%常量%
  1. 標準的運算式
%[(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'
  1. 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'

格式化呼叫方法

  1. 在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]'
  1. 添加鍵,屬性和偏移量,方括號指定字典鍵,點表示位置或關鍵字所參考的一項物件屬性,
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:擴散

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more