主頁 > 後端開發 > 字串(str、bytes)

字串(str、bytes)

2022-07-14 07:37:02 後端開發

4.3 字串(str、bytes)

4.3.1 字串前置知識

4.3.1.1 字串的概念

字串由一系列字符組成,字符(Character)是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等,字串是編程語言中表示文本的資料型別,
字串就是由一個個元素(字符)組成的,像這種由一個個元素按照順序組成的資料,在Python語言里面,把這種特性的資料稱之為 sequence,翻譯成中文就是序列,關于序列,我們將在后續內容中詳細介紹,

4.3.1.2 字符集

字符集是多個字符的集合,字符集種類較多,每個字符集包含的字符個數不同,常見字符集有:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等,
字符集簡單來說,就是一張表格,是字符和id的對應表,

4.3.1.3 字符編碼、解碼

因為計算機只能處理數字,如果要處理文本,就必須先把文本轉換為數字才能處理,最早的計算機在設計時采用8個位元(bit,也成為)作為一個位元組(byte),所以,一個位元組能表示的最大的整數就是255(二進制11111111=十進制255),如果要表示更大的整數,就必須用更多的位元組,比如兩個位元組可以表示的最大整數是65535,4個位元組可以表示的最大整數是4294967295,
計算機中儲存的資訊都是用二進制數表示的,而我們在螢屏上看到的英文、漢字等字符是二進制數轉換之后的結果,
通俗的說,按照某種規則將字符存盤在計算機中,如a用什么表示,稱為編碼;反之,將存盤在計算機中的二進制數決議成字符顯示出來,稱為解碼,如同密碼學中的加密和解密,
在解碼程序中,如果使用了錯誤的解碼規則,則會導致目標字符被決議成其它字符或者亂碼,

4.3.1.3.1 編碼發展史

美國人發明了計算機,用八位0和1的組合,一一對應英文中的字符,整出了一個表格,ASCII表,也就是大名鼎鼎的ASCII字符集,
ASCII字符集主要包括控制字符(回車鍵、退格、換行鍵等);可顯示字符(英文大小寫字符、阿拉伯數字和西文符號),
計算機傳入中國,中國地大物博,繁體字和簡體字多,8位位元組最多表示256個字符,滿足不了人們的日常作業需要,于是對ASCII擴展,新字符集叫GB2312,后來發現GB2312還不夠用,擴充之后形成GB18030,
每個國家都像中國一樣,把自己的語言編碼,于是出現了各種各樣的編碼,如果你不安裝相應的編碼,就無法正確解碼查看到正確的內容,
由于各個國家的編碼無法進行國際交流,一個國際組織一起創造了一種編碼 UNICODE(Universal Multiple-Octet Coded Character Set)規定所有字符用兩個位元組表示,就是固定的,所有的字符就兩個位元組,計算機容易識別,
UNICODE雖然解決了各自為戰的問題,但是美國人不愿意了,因為美國原來的ASCII只需要一個位元組就可以了,UNICODE編碼卻讓他們的語言多了一個位元組,白白浪費一個位元組的存盤空間,經過協商,出現了一種新的轉換格式,被稱為通用轉換格式,也就是UTF(unicode transformation format),常見的有UTF-8、UTF-16,UTF-8規定,美國字符一個位元組,歐洲兩個字符,東南亞三個字符,

4.3.1.3.2 ASCII編碼

ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,它主要用于顯示現代英語,而其擴展版本EASCII則可以顯示其他西歐語言,它是現今最通用的單位元組編碼系統,
ASCII編碼將ASCII字符集轉換為計算機系統可以存盤的數字的編碼規則,使用7位(bits)表示一個字符,共128字符;但是7位編碼的字符集只能支持128個字符,為了表示更多的歐洲常用字符對ASCII進行了擴展,ASCII擴展字符集使用8位(bits)表示一個字符,共256字符,

4.3.1.3.3 GBXXXX字符集和編碼

GB2312標準共收錄6763個漢字,GB2312對任意字符都采用雙位元組表示,
GBK共收入21886個漢字和圖形符號,GBK對任意字符都采用雙位元組表示,
GB18030共收錄漢字70244個,GB18030編碼是一二四位元組變長編碼,其單位元組,與 ASCII 編碼兼容,
注:GBK兼容GB2312,GB18030兼容GBK,

4.3.1.3.4 Unicode字符集和編碼

Unicode是國際組織制定的可以容納世界上所有文字和符號的字符編碼方案,記錄著世界上所有字符對應的一個數字,
Unicode只是一個字符集,并不是一個編碼方式,有2種,一種是UCS-2字符集,利用2個位元組表示字符,一共可以表示65535個字符,另一種是UCS-4字符集,利用4個位元組表示字符,一共可以表示近43億個字符,每一個碼位可以代表一個字符,可以不通過編碼就直接顯示出來,

4.3.1.3.5 UTF-8編碼

UTF-8 是目前互聯網上使用最廣泛的一種 Unicode 編碼方式,它的最大特點就是可變長,它可以使用 1 - 4 個位元組表示一個字符,根據字符的不同變換長度,
UTF-8以位元組為單位對Unicode進行編碼,UTF-8的特點是對不同范圍的字符使用不同長度的編碼,對于0x00—0x7F之間的字符,UTF-8編碼與 ASCII 編碼完全相同,
對于需要使用 N 個位元組來表示的字符(N > 1),第一個位元組的前 N 位都設為 1,第 N + 1 位設為0,剩余的 N - 1 個位元組的前兩位都設位 10,剩下的二進制位則使用這個字符的 Unicode 碼點來填充,

4.3.1.3.6 ANSI編碼

ANSI編碼就是當地系統默認編碼,在中國,ANSI編碼默認為GBK,

4.3.1.4 Python中的編碼、解碼

Python3的字串在Python內部的表示是unicode編碼,因此在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼,
encode的作用是將unicode編碼轉換成其他編碼的字串,如str.encode(gbk),表示將unicode編碼的字串str轉換成gbk編碼,

string = '離離原上草,一歲一枯榮'.encode('gbk')
print(type(string))
print(string)

<class 'bytes'>
b'\xc0\xeb\xc0\xeb\xd4\xad\xc9\xcf\xb2\xdd\xa3\xac\xd2\xbb\xcb\xea\xd2\xbb\xbf\xdd\xc8\xd9'

通過chardet.detect可以對編碼進行檢測
>>> print(chardet.detect(string))

{'encoding': 'GB2312', 'confidence': 0.7407407407407407, 'language': 'Chinese'}

decode的作用是將其他編碼的字串轉換成unicode編碼,如str.decode(gbk),表示將gbk編碼的字串str轉換成unicode編碼,

string = '離離原上草,一歲一枯榮'.encode('gbk')
print(string)
print(string.decode('gbk'))

b'\xc0\xeb\xc0\xeb\xd4\xad\xc9\xcf\xb2\xdd\xa3\xac\xd2\xbb\xcb\xea\xd2\xbb\xbf\xdd\xc8\xd9'
離離原上草,一歲一枯榮

總結:想要將其他的編碼轉換成UTF-8必須先將其解碼成unicode然后重新編碼成UTF-8,它是以unicode為轉換媒介的,如:s='中文' 如果是在utf8的檔案中,該字串就是utf8編碼,如果是在gb2312的檔案中,則其編碼為gb2312,這種情況下,要進行編碼轉換,都需要先用 decode方法將其轉換成unicode編碼,再使用encode方法將其轉換成其他編碼,
通常,在沒有指定特定的編碼方式時,都是使用系統默認編碼創建的代碼檔案,

PS:為了方便理解和記憶,可以粗略的將編碼理解為加密,解碼理解為解密,編碼(加密)之前的文本是能看懂的明文,但是編碼(加密)之后就成了看不懂的密文(bytes型別),不同的加密方式就對應不同的編碼方式,只有通過對應的解碼(解密)方式才能正確解密,

4.3.2 字串的創建

4.3.2.1 通過字串識別符號創建

在Python中可以使用單引號('')或雙引號("")來表示字串,多行字串可以使用三重引號 ''' 或 """ 來表示,

'hello,world'
"祝你好運~"
"""
多行內容:
離離原上草,一歲一枯榮,
野火燒不盡,春風吹又生,
遠芳侵古道,晴翠接荒城,
又送王孫去,萋萋滿別情,
"""

注意:
1、在Python中,沒有單個字符,只有字串,單獨的一個字符也是字串,
2、Python中單引號和雙引號單獨使用完全相同,

4.3.2.2 字串的拼接和重復

參見可迭代物件章節中的序列的拼接和重復

4.3.2.3 字符轉義

如果我們需要定義的字串中有引號,直接定義會報錯:
>>> string = 'Let's go'

Traceback (most recent call last):
File "C:\Program Files\Python3102\lib\code.py", line 63, in runsource
code = self.compile(source, filename, symbol)
File "C:\Program Files\Python3102\lib\codeop.py", line 185, in call
return _maybe_compile(self.compiler, source, filename, symbol)
File "C:\Program Files\Python3102\lib\codeop.py", line 102, in _maybe_compile
raise err1
File "C:\Program Files\Python3102\lib\codeop.py", line 91, in _maybe_compile
code1 = compiler(source + "\n", filename, symbol)
File "C:\Program Files\Python3102\lib\codeop.py", line 150, in call
codeob = compile(source, filename, symbol, self.flags, True)
File "", line 1
string = 'Let's go'
^
SyntaxError: unterminated string literal (detected at line 1)

這是因為定義字串時,引號要兩兩配對,而在上面的字串中出現了3個單引號,無法進行配對,這個時候我們可以用雙引號進行定義字串:
>>> string = "Let's go"
在定義字串時,單引號和雙引號都可以,字串中有單獨的雙引號也同理,
一般的,我們在用雙引號定義字串時,字串本身的內容中就不能包含雙引號,而在用單引號定義字串時,字串本身的內容中就不能包含單引號,
但是,如果需要定義的字串內容中既有單引號又有雙引號該怎么辦呢?有2種方法可以處理這種情況:
1、采用三引號定義,三單引號或雙引號都行
2、采用字符轉義

4.3.2.3.2 字符轉義

字符轉義就是用一個特定的符號對某個字符進行轉義,讓這個字符代表其它的意思,在Python中用\對符號進行轉義,常見轉義字符如下:

轉義字符 描述 顯示效果
\ 反斜杠符號 \
' 單引號 '
" 雙引號 "
\b 退格
\n 換行
\t 制表符

如果使用轉義,則上面的示例可以用'Let's go'來表示,雖然單引號包裹的內容中含有單引號,但是也不會報錯,因為字串中的單引號用\進行轉義了,

4.3.2.4 字串前綴

在Python3中,字串的型別只有2種,分別是:str、bytes,在字串前面可以加上前綴,產生不同的效果,比較常用的前綴有:r、u、b,
r:表示之后的字串中的內容不進行轉義,保持原樣
u:表示之后的字串為Unicode,在Python3中默認所有的字串為此種型別,
b:表示之后的字串為bytes型別
windows系統絕對路徑會包含\符號,如果在Python中要表示windows系統的路徑經常會報錯,因為會將路徑中的\及后面的字符當成轉義符進行轉義,對于日常使用非常不方便,這個時候就可以用到r前綴:
>>> print('C:\new\name') # 這里的\n代表換行,與預期不符

C:\new
ame

>>> print(r'C:\new\name') # 字串中的內容原樣顯示

C:\some\name

這樣,上面的字串中的\n才不會當成換行符顯示,而是保持原樣,

4.3.3 字串的訪問

4.3.3.1 字串索引

參見可迭代物件章節中的序列的索引

4.3.3.2 字串切片

參見可迭代物件章節中的序列的切片

4.3.3.3 遍歷字串

參見可迭代物件章節中的可迭代物件的遍歷

4.3.3.4 成員資格檢查

參見可迭代物件章節中的成員資格檢查

4.3.4 字串的修改

Python 字串不能修改,是可哈希的,因此,為字串中某個索引位置賦值會報錯:
>>> string = 'Python'
>>> string[0] = 'J'

Traceback (most recent call last):
File "C:\Program Files\Python3102\lib\code.py", line 90, in runcode
exec(code, self.locals)
File "", line 1, in
TypeError: 'str' object does not support item assignment

要生成不同的字串,應新建一個字串:
>>> string = 'Python'
>>> 'J' + string[1:]
>>> string[:2] + 'py'

'Jython'
'Pypy'

4.3.5 字串的洗掉

由于字串是可哈希的,因此無法洗掉字串中的某個元素(字符),要洗掉其中的某個元素(字符)也只能通過新建字串的方式完成,
>>> string = 'Python'
>>> str2 = string[:2] + string[3:]
>>> str2

'Pyhon'

4.3.6 字串格式化

如果對字串的輸出的格式有要求,需要用到字串的格式化,比如,在群發短信時,每次的名稱不一樣,但是內容是一樣的,這個時候就需要用到字串的格式化,

xx您好!這里是山東小紅花集團...

4.3.6.1 %格式化

Python可以通過使用%占位符的方式來格式化字串,例如:
>>> 'Hello, %s' % 'world'
>>> 'Hi, %s, you are %d years old.' % ('Yagami', 16)

'Hello, world'
'Hi, Yagami, you are 16 years old.'

stars = ("黎明", "華仔", "郭富城", "張學友")
print("四大天王:%s, %s, %s, %s" % stars)

四大天王:黎明, 華仔, 郭富城, 張學友

在字串內部,%s表示用字串替換,%d表示用整數替換,有幾個%?占位符,后面就跟幾個變數或者值,順序要對應好,如果只有一個%?,后面變數的括號可以省略,
%格式化中常見的占位符:

占位符 替換內容
%d 整數
%f 浮點數
%s 字串
%x 十六進制整數

其中,格式化整數和浮點數還可以指定是否補0和整數與小數的位數:

print('%9d-%09d' % (3, 1))
print('%.6f' % 3.1415926)
      3-000000001

3.141593

如果你不太確定應該用什么,%s永遠起作用,它會把任何資料型別轉換為字串:
>>> 'Age: %s. Gender: %s' % (25, True)

'Age: 25. Gender: True'

關于自定義格式,將會在后面的自定義格式章節進行詳細介紹,
使用%轉義百分號
>>> 'growth rate: %d %%' % 7

'growth rate: 7 %'

4.3.6.2 format

format是Python2.6開始新增的一種格式化字串的函式,它會用傳入的引數依次替換字串內的占位符{0}、{1}……
使用方法:通過format函式中的引數來代替字串中的{}內容,
指定位置
>>> "{} {}".format("hello", "world") # 不設定指定位置,按默認順序
>>> "{1} {0} {1}".format("hello", "world") # 設定指定位置

'hello world'
'world hello world'

設定引數
>>> "網站名:{name}, 地址:{url}".format(name="本", url="www.ben.com")

'網站名:本, 地址:www.ben.com'

通過字典設定引數
>>> site = {"name": "本", "url": "www.ben.com"}
>>> "網站名:{name}, 地址 {url}".format(**site)

'網站名:本, 地址:www.ben.com'

通過串列索引設定引數
>>> my_list = ['本', 'www.ben.com']
>>> "網站名:{0[0]}, 地址 {0[1]}".format(my_list) # "0" 是必須的

'網站名:本, 地址:www.ben.com'

使用{}轉義大括號
>>> "{} 對應的位置是 {{10}}".format("ben")

ben對應的位置是 {10}

你還可以指定要轉換的值是哪種型別,更準確地說,是要將其視為哪種型別,例如,你可能提供一個整數,但將其作為小數進行處理,為此可在格式說明(即冒號后面)使用字符f(表示定點數),
>>> "π is {:.2f}".format(3.1415926)

'π is 3.14'

關于自定義格式,將會在后面的自定義格式章節進行詳細介紹,

4.3.6.1 f-string

f-string,亦稱為格式化字串常量(formatted string literals),是Python3.6新引入的一種字串格式化方法,該方法源于PEP 498 – Literal String Interpolation,主要目的是使格式化字串的操作更加簡便,f-string在形式上是以 f 或 F 修飾符引領的字串(f'xxx' 或 F'xxx'),以大括號 {} 標明被替換的欄位;f-string在本質上并不是字串常量,而是一個在運行時運算求值的運算式,
f-string在功能方面不遜于傳統的%-formatting陳述句和str.format()函式,同時性能又優于二者,且使用起來也更加簡潔明了,因此對于Python3.6及以后的版本,推薦使用f-string進行字串格式化,
簡單使用
f-string用大括號 {} 表示被替換欄位,其中直接填入替換內容:
>>> name = 'Eric'
>>> f'Hello, my name is {name}'

'Hello, my name is Eric'

>>> number = 7
>>> f'My lucky number is {number}'

'My lucky number is 7'

>>> price = 19.99
>>> f'The price of this book is {price}'

'The price of this book is 19.99'

運算式求值與函式呼叫
f-string的大括號 {} 可以填入運算式或呼叫函式,Python會求出其結果并填入回傳的字串內:

>>> f'A total number of {24 * 8 + 4}'

'A total number of 196'

>>> f'Complex number {(2 + 2j) /(2 - 3j)}'

'Complex number(-0.15384615384615388+0.7692307692307692j)'

>>> name = 'ERIC'
>>> f'My name is {name.lower()}'

'My name is eric'

>>> import math
>>> f'The answer is {math.log(math.pi)}'

'The answer is 1.1447298858494002'

引號、大括號與反斜杠
f-string大括號內所用的引號不能和大括號外的引號定界符沖突,可根據情況靈活切換 ' 和 ":

>>> f'I am {"Eric"}'

'I am Eric'

>>> f'I am {'Eric'}'

File "<stdin>", line 1
  f'I am {'Eric'}'
              ^

SyntaxError: invalid syntax

若 ' 和 " 不足以滿足要求,還可以使用 ''' 和 """,
大括號外的引號還可以使用 \ 轉義,但大括號內不能使用 \ 轉義:

>>> f'''He'll say {"I'm Eric"}'''

"He'll say I'm Eric"

>>> f'''He'll say {"I'm Eric"}'''

File "<stdin>", line 1

SyntaxError: f-string expression part cannot include a backslash

f-string大括號外如果需要顯示大括號,則應輸入連續兩個大括號 {{ 和 }}:
>>> f'5 {"{stars}"}'
>>> f'{{5}} {"stars"}'

'5 {stars}'
'{5} stars'

上面提到,f-string大括號內不能使用 \ 轉義,事實上不僅如此,f-string大括號內根本就不允許出現 \,如果確實需要 \,則應首先將包含 \ 的內容用一個變數表示,再在f-string大括號內填入變數名,

4.3.6.2 自定義格式

通過對上述3種格式化字串的方法的學習,我們可以大致的了解在格式化字串中用到的自定義格式,
這3種格式化字串的方法中都可以用到自定義格式,方法也大同小異,下面就詳細的來介紹下如何自定義格式,
主要包括:對齊、寬度、符號、補零、精度、進制等

4.3.6.2.1 對齊相關

< 左對齊(字串默認對齊方式),&格式化使用-

右對齊(數值默認對齊方式) ,&格式化使用+
^ 居中,適用于f-stringformat

var1 = 'python'
var2 = -3.1415
print(f'|{var1:>10}|')
print('|{:^10}|'.format(var2))
print('|%+10s|' % var1)
print('|%-10s|' % var2)

| python|
| -3.1415 |
| python|
|-3.1415 |

4.3.6.2.2 數字符號相關格式描述符
  •   負數前加負號(-),正數前加正號(+)
    
  •   負數前加負號(-),正數前不加任何符號(默認)
    

空格 負數前加負號(-),正數前加一個空格

注:僅適用于數值型別,

var1 = 3.14
var2 = -4.13
print(f'|{var1:+}|')
print('|{:-}|'.format(var2))
print('|{: }|'.format(var1))
print('|%+s|' % var1)

|+3.14|
|-4.13|
| 3.14|
|3.14|

4.3.6.2.3 寬度與精度相關格式描述符

width 整數 width 指定寬度
0width 整數 width 指定寬度,開頭的 0 指定高位用 0 補足寬度
width.precision 整數 width 指定寬度,整數 precision 指定顯示精度

注意:
1、0width 不可用于復數型別和非數值型別,width.precision 不可用于整數型別,
2、width.precision 用于不同格式型別的浮點數、復數時的含義也不同:用于 f、F、e、E 和 % 時 precision 指定的是小數點后的位數,用于 g 和 G 時 precision 指定的是有效數字位數(小數點前位數+小數點后位數),
3、width.precision 除浮點數、復數外還可用于字串,此時 precision 含義是只使用字串中前 precision 位字符,

var1 = 3.1415
print(f'|{var1:8}|')
print('|{:8.3}|'.format(var1))
print('|{:.4}|'.format(var1))
print('|%10.5s|' % var1)

| 3.1415|
| 3.14|
|3.142|
| 3.141|

4.3.6.2.4 千位分隔符相關格式描述符

, 使用,作為千位分隔符
_ 使用_作為千位分隔符
注意:
1、若不指定 , 或 ,則f-string不使用任何千位分隔符,此為默認設定,
2、僅適用于浮點數、復數與十進制整數:對于浮點數和復數,, 只分隔小數點前的數位,
3、
適用于浮點數、復數與二、八、十、十六進制整數:對于浮點數和復數,_ 只分隔小數點前的數位;對于二、八、十六進制整數,固定從低位到高位每隔四位插入一個 _(十進制整數是每隔三位插入一個 _),

var1 = 31415
print(f'|{var1:_}|')
print('|{:,}|'.format(var1))
print('|%,s|' % var1)  # 不適用

|31_415|
|31,415|
Traceback (most recent call last):
File "E:\studypy\tmp.py", line 4, in
print('|%s|' % var1)
ValueError: unsupported format character '
' (0x5f) at index 2

4.3.6.2.5 格式型別相關格式描述符

格式描述符 含義與作用 適用變數型別
s 普通字串格式 字串
b 二進制整數格式 整數
c 字符格式,按unicode編碼將整數轉換為對應字符 整數
d 十進制整數格式 整數
o 八進制整數格式 整數
x 十六進制整數格式(小寫字母) 整數
X 十六進制整數格式(大寫字母) 整數
e 科學計數格式,以 e 表示 ×10^ 浮點數、復數、整數(自動轉換為浮點數)
E 與 e 等價,但以 E 表示 ×10^ 浮點數、復數、整數(自動轉換為浮點數)
f 定點數格式,默認精度(precision)是6 浮點數、復數、整數(自動轉換為浮點數)
F 與 f 等價,但將 nan 和 inf 換成 NAN 和 INF 浮點數、復數、整數(自動轉換為浮點數)
g 通用格式,小數用 f,大數用 e 浮點數、復數、整數(自動轉換為浮點數)
G 與 G 等價,但小數用 F,大數用 E 浮點數、復數、整數(自動轉換為浮點數)
% 百分比格式,數字自動乘上100后按 f 格式排版,并加 % 后綴 浮點數、整數(自動轉換為浮點數)

4.3.7 字串的方法

4.3.7.1 編碼解碼類

4.3.7.1.1 encode(encoding='UTF-8',errors='strict')

描述
對指定的字串進行編碼,編碼后的回傳結果是bytes型別,
errors引數用來設定不同錯誤的處理方案,默認為 'strict',意為編碼錯誤引起一個UnicodeError,其他可能得值有 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace'
示例

s1 = 'ab甲乙'
s2 = s1.encode(encoding='utf-8')
print(s2)

b'ab\xe7\x94\xb2\xe4\xb9\x99'

4.3.7.1.2 decode(encoding="utf-8", errors="strict")

描述
對bytes物件的進行解碼,解碼后的回傳結果為str型別,
errors引數用來設定不同錯誤的處理方案,默認為 'strict',意為編碼錯誤引起一個UnicodeError, 其他可能得值有 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace'
示例

s1 = 'ab甲乙'
s2 = s1.encode(encoding='utf-8')
print(s2)
s3 = s2.decode(encoding='utf-8')
print(s3)

b'ab\xe7\x94\xb2\xe4\xb9\x99'
ab甲乙

4.3.7.2 查找統計類

4.3.7.2.1 count

參見可迭代物件章節中序列小節中的序列count方法

4.3.7.2.2 find(str, beg=0, end=len(string))、rfind

描述
回傳str在string里面出現的索引,未找到則回傳-1,rfind表示從右邊開始查找,
beg引數和end引數代表查找的范圍,默認在整個str中查找,
示例

s = ' Python tian \t mao \n taobao '
print(s.find('o'))
print(s.find('ao'))
print(s.find('io'))

5
16
-1

4.3.7.2.3 index、rindex

可參見可迭代物件章節中序列小節中的序列index方法

4.3.7.3 格式化類

4.3.7.3.1 center(width, fillchar)

描述
回傳一個指定的寬度width居中的字串,fillchar為填充的字符,默認為空格,
示例

s = ' Python tian \t mao taobao '
print(f"|{s.center(30)}|")
print(f"|{s.center(30, '*')}|") 

| Python tian mao taobao |
|** Python tian mao taobao **|

4.3.7.3.2 ljust(width[, fillchar])、rjust

描述
回傳一個原字串左(右)對齊,并使用fillchar填充至長度width的新字串,fillchar默認為空格,
示例

s = ' Python tian \t mao taobao '
print(f"|{s.ljust(30)}|")
print(f"|{s.ljust(30, '*')}|") 

| Python tian mao taobao |
| Python tian mao taobao ****|

4.3.7.3.3 zfill(width)

描述
回傳長度為width的字串,原字串右對齊,前面填充0
示例

s = ' Python tian \t mao taobao '
print(f"|{s.zfill(30)}|")

|0000 Python tian mao taobao |

4.3.7.4 合并截取類

4.3.7.4.1 join(seq)

描述
以指定字串作為分隔符,將seq中所有的元素(的字串表示)合并為一個新的字串,
示例

seq = ['a', 'b', 'c']
s = '*'.join(seq)
print(s)

abc

4.3.7.4.2 lstrip()、rstrip()

描述
截掉字串左邊(右邊)的空格或指定字符,
示例

s = ' Python tian \t mao taobao '
print(f"|{s.lstrip()}|")
print(f"|{s.rstrip()}|")
print(f"|{s.rstrip('ao ')}|")

|Python tian mao taobao |
| Python tian mao taobao|
| Python tian mao taob|

4.3.7.4.3 split(str="", num=string.count(str))

描述
以str為分隔符截取字串,默認為空格、換行、制表符等,如果 num 有指定值,則僅截取 num+1 個子字串
示例

s = ' Python tian \t mao \n taobao '
print(f"|{s.split()}|")
print(f"|{s.split('o')}|")

|['Python', 'tian', 'mao', 'taobao']|
|[' Pyth', 'n tian \t ma', ' \n ta', 'ba', ' ']|

4.3.7.4.4 splitlines([keepends])

描述
按照行('\r','\r\n',\n')分隔,回傳一個包含各行作為元素的串列,如果引數keepends為False,不包含換行符,如果為True,則保留換行符,
示例

s = ' Python tian \t mao \n taobao '
print(f"|{s.splitlines()}|")
print(f"|{s.splitlines(True)}|")

|[' Python tian \t mao ', ' taobao ']|
|[' Python tian \t mao \n', ' taobao ']|

4.3.7.4.5 strip([chars])

描述
在字串上同時執行lstrip()和rstrip()
示例

s = ' Python tian \t mao taobao '
print(f"|{s.strip()}|")
print(f"|{s.strip('ao ')}|")

|Python tian mao taobao|
|Python tian mao taob|

4.3.7.5 判斷類

4.3.7.5.1 startswith(substr, beg=0,end=len(string))、endswith

描述
檢查字串是否是以指定子字串substr開頭,是則回傳True,否則回傳False,如果beg 和 end 指定值,則在指定范圍內檢查,
示例

s = ' Python tian \t mao taobao '
print(f"|{s.startswith(' ')}|")
print(f"|{s.endswith('a')}|")

|True|
|False|

4.3.7.5.2 islower()、isupper()

描述
如果字串中有可以區分大小寫的字符,并且都是小寫(大寫),則回傳True,否則回傳False
示例

s = ' python tian \t mao 賽車12 '
print(f"|{s.islower()}|")
print(f"|{s.isupper()}|")

|True|
|False|

4.3.7.5.3 isalnum()

描述
如果字串僅包含字母和數字,則回傳True,否則回傳False,
示例

s1 = 'python 賽車12'
print(f"|{s1.isalnum()}|")
s2 = 'python 12'
print(f"|{s2.isalnum()}|")
s3 = 'python12'
print(f"|{s3.isalnum()}|")

|False|
|False|
|True|

4.3.7.5.4 isalpha()

描述
如果字串僅包含字母和文字(中文、日文等),則回傳True,否則回傳False,
示例

s1 = 'python 賽車12'
print(f"|{s1.isalpha()}|")
s2 = 'python 12'
print(f"|{s2.isalpha()}|")
s3 = 'python12'
print(f"|{s3.isalpha()}|")
s4 = 'python賽車'
print(f"|{s4.isalpha()}|")
s5 = 'こんにちは'
print(f"|{s5.isalpha()}|")

|False|
|False|
|False|
|True|
|False|

4.3.7.5.5 isdecimal()

描述
檢查字串是否只包含十進制字符,如果是回傳true,否則回傳false,
示例

s = 'python 賽車12'
print(f"|{s.isdecimal()}|")
s = 'p12'
print(f"|{s.isdecimal()}|")
s = '12'
print(f"|{s.isdecimal()}|")
s = '0x12'
print(f"|{s.isdecimal()}|")

|False|
|False|
|True|
|False|

4.3.7.5.6 isdigit()、isnumeric()

描述
如果字串中僅包含數字,則回傳True,否則回傳False,

4.3.7.5.7 isspace()

描述
如果字串中僅包含空格,則回傳True,否則回傳False,

4.3.7.5.8 istitle()

描述
如果字串中的單詞全都是title格式(首字母大寫),則回傳True,否則回傳False,

4.3.7.6 轉換類

4.3.7.6.1 capitalize()

描述
僅將字串的第一個字符轉換為大寫,如果第一個不是字母,則不做操作,
示例

s = ' python Tian 賽車12 '
print(f"|{s.capitalize()}|")
s = 'python Tian 賽車12 '
print(f"|{s.capitalize()}|")

| python tian 賽車12 |
|Python tian 賽車12 |

4.3.7.6.2 lower()、upper()

描述
將字串中的小寫(大寫)字母全部轉換成大寫(小寫)字母
示例

s = ' pyTHon Tian 賽車12 '
print(f"|{s.lower()}|")
s = 'python Tian 賽車12 '
print(f"|{s.upper()}|")

| python tian 賽車12 |
|PYTHON TIAN 賽車12 |

4.3.7.6.3 replace(old, new [, max])

描述
把將字串中的old替換成new,如果max指定,則替換不超過max次,
示例

s = ' pyTHon Tian 賽車12 '
print(f"|{s.replace('T','*')}|")
print(f"|{s.replace('T','*', 1)}|")
print(f"|{s.replace('Ti','/', 1)}|")

| py*Hon ian 賽車12 |
| py
Hon Tian 賽車12 |
| pyTHon /an 賽車12 |

4.3.7.6.4 title()

描述
回傳標題化的字串,就是說所有單詞都是以大寫開始,其余字母均為小寫,

4.3.7.6.5 expandtabs(tabsize)

描述
把字串string中的tab符號轉為空格,tab符號默認的空格數是8,
示例

s = '\tTian 賽車12 '
print(f"|{s}|")
print(f"|{s.expandtabs()}|")
print(f"|{s.expandtabs(2)}|")

| Tian 賽車12 |
| Tian 賽車12 |
| Tian 賽車12 |

4.3.7.6.6 swapcase()

描述
將字串中大寫轉換為小寫,小寫轉換為大寫,

4.3.7.6.7 maketrans()、translate(table, deletechars="")

描述
maketrans用于創建字符映射的轉換表,對于接受兩個引數的最簡單的呼叫方式,第一個引數是字串,表示需要轉換的字符,第二個引數也是字串表示轉換的目標,
translate則根據table給出的表(包含256個字符)轉換string的字符,
這兩個方法組合可以方便快速的對字串多個字符進行替換,
示例

s = ' python Tian 賽車12 '
x = "yo"
y = "ab"
z = "車"   # 設定洗掉的字符
mytable = s.maketrans(x, y, z)
print(mytable)
print(s.translate(mytable))

{121: 97, 111: 98, 36710: None}
pathbn Tian 賽12

從自動化辦公到智能化辦公

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/499030.html

標籤:Python

上一篇:python with as的用法

下一篇:利用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