[Python]第三章 使用字串
文章目錄
- 3.1字串基本操作
- 3.2設定字串的格式:精簡版
- 3.3 設定字串的格式:完整版
- 3.4字串方法—— .方法名()
- 3.4.1 center(n,X)——通過在兩邊新增填充n字元X(預設為空格)讓字串居中。
- 3.4.2 find(X,n1,n2)——在字串中查詢子串X從起始位置n1到終點位置n2(不含)出現的位置索引,沒找到返回-1
- 3.4.3 join——合併序列的元素 x.join(S) 用拼接符x將序列S裡面的元素拼接起來
- 3.4.4 lower()——返回字串的小寫版本。
- 3.4.5 replace(old_text,new_text)——將指定子串都替換為另一個字串
- 3.4.6 split()——將字串拆分為序列 S.split(x)以符號x拆分字串S
- 3.4.7 srip(x)——將字串開頭和末尾的空白/特定字元x(但不包括中間的空白)刪除,並返回刪除後的結果。
- 3.4.8 translate(table)——用新建好的轉換表table進行單字元替換,同時替換多個字元
- 3.4.9 判斷字串是否滿足特定條件
3.1字串基本操作
字串也是序列,因此通用的序列操作都可以實現(索引、切片、相加、乘法、成員資格)
>>> a='congratulations'
>>> a[9:-1]
'ation'
>>> 'congratulations'[5]
'a'
>>> 'congratulations'[8:]
'lations'
>>> 'congratu'+'lations'
'congratulations'
>>> 'ha'+2*'p'+'y'
'happy'
>>> 'on' in 'congrutulations'
True
但是字串是不可變,因此不可以切片複製或者元素賦值
>>> ‘happy’[1]=’k’ #報錯
>>> ‘happy’[:2]=’kk’ #報錯
3.2設定字串的格式:精簡版
方式一: ‘…%s…’ % values
%s稱為轉換說明符,指出了要將值插入什麼地方
>>> format = "Hello, %s. %s enough for ya?"
>>> values = ('world', 'Hot')
>>> format % values
'Hello, world. Hot enough for ya?'
如果指定的值不是字串,使用str將其轉換為字串。
>>> format="Hello,%s.%s is you teacher"
>>> val=('kk',12)
>>> format%val
'Hello,kk.12 is you teacher'
%.3f將值的格式設定為包含3位小數的浮點數。
>>> form=('score:%.3f')
>>> vaa=44.36977
>>> form%vaa
'score:44.370'
方式二:template(…$key…).substitute(key=value)
模板字串,包含等號的引數稱為關鍵字引數,可將關鍵字引數視為一種向命名替換欄位提供值的方式。
>>> from string import Template
>>> tmpl = Template("Hello, $who! $what enough for ya?")
>>> tmpl.substitute(who="Mars", what="Dusty")
'Hello, Mars! Dusty enough for ya?'
方式三:S{ /index /key}.format(values /key=value)
使用字串方法.format( ),
>>> "{}, {} and {}".format("first", "second", 3)
'first, second and 3'
被替換欄位花括號指定format裡面的索引
>>> "{2}, {0} and {1}".format("second", 3,"first")
'first, second and 3'
關鍵字引數的排列順序無關緊要
>>> from math import pi
>>> "{name} is approximately {value:.2f}.".format(value=pi, name="π")
'π is approximately 3.14.'
Notice: 說明符.2f,並使用冒號將其與欄位名隔開。它意味著要使用包含2位小數的浮點數格式
>>> from math import pi
>>> "{name} is approximately {pi}.".format(pi=pi, name="π")
'π is approximately 3.14.'
方式四:f’…{e}…’
如果變數與替換欄位同名, 在字串前面加上f
>>> from math import pi
>>>f"π is approximately {pi}."
'π is approximately 3.14141592653589793.'
但如果還有其他引數值未被定義,則不能既新增f,又用format()方法
>>> from math import pi
>>>f"{name} is approximately {pi}.".format(name="π")
報錯:name ‘name’ is not defined
3.3 設定字串的格式:完整版
3.3.1 替換欄位名
“{ /index /key}”.format(values /key=value)
>>> "{foo} {} {bar} {}".format(1, 2, bar=4, foo=3)
'3 1 4 2'
>>> "{foo} {1} {bar} {0}".format(1, 2, bar=4, foo=3)
'3 2 4 1'
Notice:如果format()裡面既有值,又有鍵值對,把值放在鍵值對後面會報錯
關鍵字引數必須跟隨在位置引數後面!
>>> "{foo} {} {bar} {}".format(bar=4, foo=3,1, 2)
報錯,bar=4, foo=3應該在1,2後面
不能同時使用手工編號和自動編號
如果format裡面的序列已經指定名稱,則使用的索引編號也要帶名稱
>>> fullname = ["Alfred", "Smoketoomuch"]
>>> "Mr {name[1]}".format(name=fullname)
'Mr Smoketoomuch'
>>>"Mr {fullname[1]}".format(fullname)
報錯
使用句點表示法來訪問匯入的模組中的方法、屬性、變數和函式
>>> import math
>>> tmpl = "The {mod.__name__} module defines the value {mod.pi} for π"
>>> tmpl.format(mod=math)
'The math module defines the value 3.141592653589793 for π'
3.3.2 基本轉換
指定要在欄位中包含的值後,就可新增有關如何設定其格式的指令了
>>> print("{pi!s} {pi!r} {pi!a}".format(pi="π"))
π 'π' '\u03c0'
上述三個標誌(s、r和a)指定分別使用str、repr和ascii進行轉換。
字串格式設定中的型別說明符
型別 | 含 義 |
---|---|
b | 將整數表示為二進位制數 |
c | 將整數解讀為Unicode碼點 |
d | 將整數視為十進位制數進行處理,這是整數預設使用的說明符 |
e | 使用科學表示法來表示小數(用e來表示指數) |
E | 與e相同,但使用E來表示指數 |
f | 將小數表示為定點數(預設6位小數) |
F | 與f相同,但對於特殊值(nan和inf),使用大寫表示 |
g | 自動在定點表示法和科學表示法之間做出選擇。這是預設用於小數的說明符,但在預設情況下至少有1位小數 |
G | 與g相同,但使用大寫來表示指數和特殊值 |
n | 與g相同,但插入隨區域而異的數字分隔符 |
o | 將整數表示為八進位制數 |
s | 保持字串的格式不變,這是預設用於字串的說明符 |
x | 將整數表示為十六進位制數並使用小寫字母 |
X | 與x相同,但使用大寫字母 |
% | 將數表示為百分比值(乘以100,按說明符f設定格式,再在後面加上%) |
3.3.3 寬度、精度和千位分隔符
寬度 :n
>>> "{num:10}".format(num=3)
' 3'
>>> "{name:10}".format(name="Bob")
'Bob '
精度 :.nf
>>> "Pi day is {pi:.2f}".format(pi=pi)
'Pi day is 3.14'
同時指定寬度和精度(數字) :n.nf
>>> "{pi:10.2f}".format(pi=pi)
' 3.14'
同時指定寬度和精度(其他) :n.n
>>> "{:.5}".format("Guido van Rossum")
'Guido'
可使用逗號來指出你要新增千位分隔符。
>>>"{:,}".format(10000000000000)
'10,000,000,000,000'
同時指定寬度、分隔符、精度
>>>"{:30,.3f}".format(10000000000000)
' 10,000,000,000,000.000'
3.3.4 符號、對齊和用0 填充
在指定寬度和精度的數前面,可新增一個標誌。這個標誌可以是零、加號、減號或空格,其中零表示使用0來填充數字。
>>>'{:010.2f}'.format(2.3659)
'0000002.37'
要指定左對齊、右對齊和居中,可分別使用<、>和^
>>>'{:<10.2f}'.format(2.3659)
'2.37 '
>>>'{:^10.2f}'.format(2.3659)
' 2.37 '
>>>'{:>10.2f}'.format(2.3659)
' 2.37'
可以使用填充字元來擴充對齊說明符
Notice:如果以非空格填充,對齊符號不能缺
>>>'{:*^15.2f}'.format(2.3659)
'*****2.37******'
新增符號
'{:.2f} and {:.2f}'.format(3.1415,-3.1415)
'3.14 and -3.14'
>>> print('{0:-.2}\n{1:-.2}'.format(pi, -pi)) #預設設定
3.1
-3.1
>>> print('{0:+.2}\n{1:+.2}'.format(pi, -pi))
+3.1
-3.1
井號(#)在符號說明符和寬度之間,這個選項將觸發另一種轉換方式,轉換細節隨型別而異
>>> "{:#b}".format(42)
'0b101010'
>>> "{:#g}".format(42)
'42.0000'
CASE 列印價格單
知識點1:header_fmt和fmt
如果要列印花括號,需要在外側再加上一對花括號
‘{{:{}}}’.format(25)
‘{:25}’
知識點2:
3.4字串方法—— .方法名()
字串很多方法繼承自String模組
string.digits:包含數字0~9的字串。
string.ascii_letters:包含所有ASCII字母(大寫和小寫)的字串。
string.ascii_lowercase:包含所有小寫ASCII字母的字串。
string.printable:包含所有可列印的ASCII字元的字串。
string.punctuation:包含所有ASCII標點字元的字串。
string.ascii_uppercase:包含所有大寫ASCII字母的字串。
3.4.1 center(n,X)——通過在兩邊新增填充n字元X(預設為空格)讓字串居中。
>>> "The Middle by Jimmy Eat World".center(39)
' The Middle by Jimmy Eat World '
>>> "The Middle by Jimmy Eat World".center(39, "*")
'*****The Middle by Jimmy Eat World*****'
Notice:空格數或者填充符數=(n-字元數),且左邊(n-字元數)//2,右邊= 左邊+(n-字元數)%2
3.4.2 find(X,n1,n2)——在字串中查詢子串X從起始位置n1到終點位置n2(不含)出現的位置索引,沒找到返回-1
>>> 'congrutulations'.find('on')
1
>>> 'congrutulations'.find('on',5,14)
12
>>> 'congrutulations'.find('d‘’)
-1
該方法可以實現成員資格的功能,只是返回的是索引位置,不是布林值
3.4.3 join——合併序列的元素 x.join(S) 用拼接符x將序列S裡面的元素拼接起來
所合併序列的元素必須都是字串
>>>sq=[1,2,3,4]
>>>ss='+'
>>>ss.join(sq)
報錯
>>>sq=['1','2','3','4'] # 列表
>>>ss='+'
>>>ss.join(sq)
'1+2+3+4'
>>>dd='d','f','t','r' # 元組
>>>''.join(dd)
'dftr'
>>>dd='d','f','t','r'
>>>'/'.join(dd)
'd/f/t/r'
拼接符和序列的位置也不能置換
>>>sq=['1','2','3','4']
>>>ss='+'
>>>sq.join(ss)
報錯
Notice:相反函式split
3.4.4 lower()——返回字串的小寫版本。
>>> 'Trondheim Hammer Dance'.lower()
'trondheim hammer dance'
>>>if 'Gumby' in ['gumby','jack','anny']:
>>> print('found it!')
>>>else:
>>> print('not found!')
’not found’
>>>if 'Gumby' .lower() in ['gumby','jack','anny']:
>>> print('found it!')
>>>else:
>>> print('not found!')
‘found it’
Notice:相反函式upper
3.4.5 replace(old_text,new_text)——將指定子串都替換為另一個字串
>>>'to be or not to be'.replace('be','kk')
'to kk or not to kk'
3.4.6 split()——將字串拆分為序列 S.split(x)以符號x拆分字串S
>>>'1:2:3:4:5:6'.split(':')
['1', '2', '3', '4', '5', '6']
如果沒有指定分隔符,將預設在單個或多個連續的空白字元(空格、製表符、換行符等)處進行拆分。
>>>'to be or not to be'.split()
['to', 'be', 'or', 'not', 'to', 'be']
3.4.7 srip(x)——將字串開頭和末尾的空白/特定字元x(但不包括中間的空白)刪除,並返回刪除後的結果。
>>>' he is a good boy '.strip()
'he is a good boy'
>>>if 'gumby ' in ['gumby','jack','anny']:
>>> print('found it!')
>>>else:
>>> print('not found!')
not found!
>>>if 'gumby '.strip() in ['gumby','jack','anny']:
>>> print('found it!')
>>>else:
>>> print('not found!')
found it!
刪除頭尾部特定字元
>>>'*!*he*is a good boy***!'.strip('*')
'!*he*is a good boy***!'
刪除頭尾部多種特定字元只要將字元寫在同一個‘ ’下面即可
>>>'*!*he*is a good boy***!'.strip('*!')
'he*is a good boy'
3.4.8 translate(table)——用新建好的轉換表table進行單字元替換,同時替換多個字元
首先呼叫maketrans方法建立一個轉換表
>>>table= str.maketrans('cs','kz') #將所有的c和s分別轉為k和z
>>>table
{99: 107, 115: 122} #Unicode碼點之間的對映c:k,s:z。
>>>'this is an incredible table'.translate(table)
'thiz iz an inkredible table'
3.4.9 判斷字串是否滿足特定條件
判斷字串是否具有特定的性質的方法,很多以is開頭,如:
Isspace 包含的字元全為空白
Isdigit 包含的字元全為數字
isupper包含的字元全為大寫 等
滿足返回True