python3基礎:字串
字串
目錄
7.1 strip()/lstrip()/rstrip():去掉空白字元
7.2 upper()/lower()/swapcase():大小寫轉換及互換
7.3 capitalize():將第1個單詞首字母大寫
7.5 ljust()/rjust()/center():左、右、居中對齊
7.7 find()/rfind():查詢子字串的位置
7.8 index()/rindex():查詢子字串的位置
7.9 replace()/expandtabs():替換字串的指定內容
7.10 split()/rsplit()/splitlines():預設用空白字元切割
7.12 startswith()/endswith()/in:開頭、結尾是否存在
7.14 isalnum():是否為數字或字母
7.17 islower()/isupper()是否為大寫或小寫
7.19 maketrans()/translate():字串對映
7.21 chr/ord:字元和ascii碼轉換
7.22 count():統計字元中元素出現的個數
7.23 +操作符效率不高,可以用以下方法代替:
1.字串物件是不可變的
字串是不可變的
>>> s1="a"
>>> id(s1)
34344888
>>> s1+="b"
>>> id(s1)
38588912
>>> 'a'=='a'
True
>>> 'a' in 'abc'
True
>>> 'a'=='b'
False
>>> 'a'!='b'
True
>>> 'a' is 'a'
True
>>> 'a' is not 'a'
False
2.用id判斷字串的地址
字串值一樣的在記憶體中是同一個地址
>>> a='a'+'b'
>>> id(a)
2348771931616
>>> id('ab')
2348771931616
>>>
3.字串的兩種型別:str和bytes
只要不是在記憶體中使用時全部都是bytes型別
>>> s = "abc"
>>> type(s)
<class 'str'>
>>> s = "abc".encode("utf-8")
>>> type(s)#用於網路傳輸
<class 'bytes'>
不能直接將中文定義為bytes型別
>>> s = b'aaaa'
>>> type(s)
<class 'bytes'>
>>> s= b'中國'
File "<stdin>", line 1
SyntaxError: bytes can only contain ASCII literal characters.
>>> s = '中國'.encode('utf-8')
>>> s = '中國'.encode()
>>> import sys
>>> sys.getdefaultencoding()#判斷預設的編碼
'utf-8'
4.元字元r/R:表示後面的字元不需要轉義
>>> print('1\n2')
1
2
>>> print(r'1\n2')
1\n2
>>> print(R'1\2')
1\2
>>> print('1\2')
1
>>> print('1\\2')#轉義
1\2
>>>
5.換行和轉義
轉義字元 |
描述 |
\(在行尾時) |
續行符,也就是多行語句符 |
\\ |
反斜槓符號 |
\’ |
單引號 |
\" |
雙引號 |
\a |
響鈴 |
\b |
退格(Backspace) |
\e |
轉義 |
\000 |
空(不可見字元) |
\n |
換行(不可見字元) |
\v |
縱向製表符(不可見字元) |
\t |
橫向製表符(不可見字元) |
\r |
回車(不可見字元) |
\f |
換頁(不可見字元) |
\oyy |
八進位制數yy代表的字元,例如:\o12代表換行 |
\xyy |
十進位制數yy代表的字元,例如:\x0a代表換行 |
\other |
其它的字元以普通格式輸出 |
不同平臺下的換行符:
window:
>>> import os
>>> os.linesep
'\r\n'
>>>
linu/mac:
>>> import os
>>> os.linesep
'\n'
列印單引號
>>> print("'")
'
>>> print('\'')
'
6.字串格式化
6.1%格式化輸出:
符號 |
描述 |
%c |
%c 格式化字元及其ASCII碼 |
%s |
%s 格式化字串 |
%d |
%d 格式化整數 |
%u |
%u 格式化無符號整型,和%d一致 |
%o |
%o 格式化無符號八進位制數 |
%x |
%x 格式化無符號十六進位制數 |
%X |
%X 格式化無符號十六進位制數(大寫) |
%f |
格式化浮點數,可指定小數點後的位數,預設保留小數點後6位 |
%e |
%e 用科學計數法格式化浮點數 |
%E |
%E 作用同%e,用科學計數法格式化浮點數 |
%g |
%g %f 和%e的簡寫 |
%G |
%G %f 和 %E的簡寫 |
%p |
%p 用十六進位制數格式化變數的地址 |
>>> '%s=%s'%(1,2)
'1=2'
>>> '%d=%d'%(1,2)
'1=2'
>>> '%d=%d'%('a',2)#不是數字會報錯
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: %d format: a number is required, not str
>>> '%.2f=%.2f'%(1,2)#保留小數點後兩位
'1.00=2.00'
>>> '%.2f=%.2f'%(1.9999,2.5555) #會四捨五入
'2.00=2.56'
name = 'ruby'
#格式化字串
print ("My name is %s and \ weight is %d kg" %(name, 21))
6.2模板格式化
>>> from string import Template
>>> s = Template('There are ${key1} ${key2} Quotations Symbols')
>>> print (s.substitute(key2='Python', key1=3))
There are 3 Python Quotations Symbols
7.字串常用方法:
7.1 strip()/lstrip()/rstrip():去掉空白字元
用法:S.strip([chars])
作用:去掉字串左右的空白字元(\r、\t、\n、\f、空格),並返回處理後的結果,原始的字串並未改變
說明:不帶引數的strip()函式,表示把S中前後所有的空白字元全部去掉,包 括’\n’ , ‘\t’ , ‘\r’ , ’ ’ 等不可見字串,可以理解為把S前後空白字串替換為None;帶引數的strip()函式表示將S前後指定字串chars去掉。
lstrip()和rstrip()分別為去除左側或右側的空白字元
>>> "****abc******".strip("*")
'abc'
>>> "****abc******".strip("*#")#裡面有的都可以去除
'abc'
>>> "###****abc******####".strip("*#")
'abc'
>>> "###*** *abc******####".rstrip('*#')
'###*** *abc'
>>> "###*** *abc******####".lstrip('*#')
' *abc******####'
>>> " \t\nabc ".strip()
'abc'
>>> " \t\nabc ".lstrip()
'abc \t'
>>> " \t\nabc ".rstrip()
' \t\t\nabc'
''.join([chr(i) for i in range(97,123)])#快速的生成全部的小寫字母
7.2 upper()/lower()/swapcase():大小寫轉換及互換
>>> 'aC'.upper()
'AC'
>>> 'aC'.lower()
'ac'
>>> '1'.lower()#數字也可以執行lower或upper,不過沒什麼意義
'1'
>>> 'aC'.swapcase()
'Ac'
>>> "abc bcd".swapcase()
'ABC BCD'
>>> "Bbc bCD".swapcase()
'bBC Bcd'
7.3 capitalize():將第1個單詞首字母大寫
>>> 'and python'.capitalize()
'And python'
7.4 title():將所有單詞首字母大寫
>>> "abc bcd".title()
'Abc Bcd'
>>> string.capwords("abc bcd")
'Abc Bcd'
注意:capwords和title的作用相同,只不過在string模組中
7.5 ljust()/rjust()/center():左、右、居中對齊
s.ljust(width,[fillchar])
作用:輸出width個字元,S左對齊,不足部分用fillchar填充,預設為空格。
>>> 'abc'.ljust(10)
'abc '
>>> 'abc'.rjust(10)
' abc'
>>> 'abc'.center(10)
' abc '
>>>
ljust()、rjust()、center()
>>> "abc".ljust(10)
'abc '
>>> "abc".ljust(10,"*")
'abc*******'
>>> "abc".rjust(10,"*")
'*******abc'
>>> "abc".center(10,"*")
'***abc****'
>>> "abc".center(10,"**")#只能是一個字元
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: The fill character must be exactly one character long
>>>
所有的標點符號
>>> import string
>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>[email protected][\\]^_`{|}~'
去掉字串中的標點:
list(map(lambda x:x.strip(string.punctuation),"I am a boy, you r a girl! yes
!".split()))
7.6 zfill():填充
用法:S.zfill(width)
作用:把S變成width長,並在右對齊,不足部分用0補足
>>> '123'.zfill(10)
'0000000123'
>>> '1234'.zfill(1)
'1234'
7.7 find()/rfind():查詢子字串的位置
在指定字串範圍內查詢子字串第一次出現的位置
用法:s.find(substr, [start, [end]]) /s.rfind(substr, [start, [end]])
作用:返回s中出現substr的第一個字母的標號,如果s中沒有substr則返回 -1。start和end作用就相當於在s[start:end]中搜索 (注意是開區間)
>>> '1234'.find('5')
-1
>>> '1234'.find('3')
2
>>> '1234'.find('3',0)
2
>>> '1234'.find('3',0,1)
-1
>>> '1234'.find('3',3)
-1
>>> '123334'.find('3',2)
2
>>> '1234'.find('4',1,3)#開區間
-1
>>> '4234'.rfind('4')#從右側開始查詢
3
7.8 index()/rindex():查詢子字串的位置
可在指定字串範圍內查詢子字串出現的位置,找不到則返回錯誤
用法:s.index(substr, [start, [end]])/s.rindex(substr, [start, [end]])#開區間
作用:與find()相同,只是在s中沒有substr時,會返回一個執行時錯誤
>>> '1234'.index('3')
2
>>> '1234'.index('5')#執行時錯誤
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
7.9 replace()/expandtabs():替換字串的指定內容
用法:s.replace(oldstr, newstr, [count])
作用:把s中的oldstar替換為newstr,count 為替換次數。還有 一些函式進行特殊字元的替換
>>> "abca".replace('bc','xxxx')
'axxxxa'
>>> "abca".replace('a','xxxx')
'xxxxbcxxxx'
>>> "abca".replace('a','xxxx',1)
'xxxxbca'
>>> "abc def ane 222".replace(' ','') #相當於刪除空格
'abcdefane222'
>>>
expandtabs()
用法:s.expandtabs([tabsize])
作用:將tab替換為指定的空格數量,把s中的tab字元替換為空格,每個tab替換為tabsize個空格,預設是8個
>>> '1 2 3'.expandtabs(1)
'1 2 3'
>>> '1 2 3'.expandtabs()
'1 2 3'
7.10 split()/rsplit()/splitlines():預設用空白字元切割
用法:s.split([sep, [maxsplit]])
作用:以sep為分隔符,把S分成一個list,maxsplit表示分割的次
數。預設的分割符為空白字元
>>> 'a b \nd\re'.split()
['a', 'b', 'd', 'e']
>>> 'a*b*c*d**E'.split('*')
['a', 'b', 'c', 'd', '', 'E']
>>> 'a*b*c*d**E'.split('*',1)
['a', 'b*c*d**E']
>>> 'a*b*c*d**E'.rsplit('*',1)
['a*b*c*d*', 'E']
splitlines():
用法:s.splitlines([keepends])
作用:按照行分隔符分為一個list,keepends是一個bool值,如果為真每行後而會保留行分割符。
>>> s='1\n2\n'
>>> print (s.splitlines(True))
['1\n', '2\n']
>>> print (s.splitlines())
['1', '2']
>>> print (s.splitlines(1))#按行分隔符分隔,且保留行分隔符
['1\n', '2\n']
7.11 join():字串連線
將列表/元組拼接為字串,列表/元組中的必須為字元
>>> '*'.join([1,2,3])#不是字元會報錯
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected str instance, int found
>>> '*'.join(['1','2','3'])
'1*2*3'
>>> '*'.join(('1','2','3'))#也可以是元組
'1*2*3'
7.12 startswith()/endswith()/in:開頭、結尾是否存在
判斷字串是否以某個字串為開頭或結尾
>>> "abc".startswith("a")
True
>>> "abc".endswith("c")
True
>>> "abc".startswith("c")
False
>>> "abc".endswith("a")
False
>>> 'a' in 'abc'
True
>>> 'a' is 'a'
True
>>> 'a'=='a'
True
>>> 'a'!='a'
False
>>>
7.13 isalpha():是否全部為字母
作用:如果字串中所有的字元都是由字母組成,並且至少有一個字元,返回True,否則返False。
>>> "abc".isalpha()
True
>>> "abc1".isalpha()
False
7.14 isalnum():是否為數字或字母
作用:如果字串中所有的字元都是由數字或字母組成,並且至少有一個字元,返回True,否則返False。
>>> 'abcd'.isalnum()
True
>>> '1'.isalnum()
True
>>> '1sdns2'.isalnum()
True
>>> '1 2'.isalnum()
False
7.15 isdigit():是否全部為數字
作用:如果字串中所有的字元都是由數字組成,並且至少有一個字元,返回True,否則返False。
>>> "abc1".isdigit()
False
>>> "341".isdigit()
True
>>> "31.25".isdigit()#有小數點不行
False
7.16 isspace():是否為空格
作用:如果字串中所有的字元都是由空格組成,並且至少有一個字元,返回True,否則返False。
>>> ''.isspace()
False
>>> ' '.isspace()
True
7.17 islower()/isupper()是否為大寫或小寫
>>> '13abc'.islower()
True
>>> '13ASD'.isupper()#數字會忽略
True
7.18 istitle():
作用:檢測字串中所有的單詞首字母是否為大寫字母,其他為小寫字母,並且z字串中至少有一個字母,則返回True,否則返回False。
>>> 'Apple is good'.istitle()
False
>>> 'Apple Is Good'.istitle()
True
>>> 'A'.istitle()
True
>>> "Today Is 21 Fine Day".istitle()
True
>>>
7.19 maketrans()/translate():字串對映
用法:str.maketrans(from, to)
作用:返回一個256個字元組成的翻譯表,其中from中的字元被一一對應地轉換成to,所以from和to必須是等長的。
用法:s.translate(table[,deletechars])
作用:使用上面的函式產後的翻譯表,把s進行翻譯,並把deletechars中有的字元刪掉。需要注意的是,s必須為位元組字串,unicode字串不支援 deletechars引數
>>> map = str.maketrans('123', 'abc')
>>> s = '54321123789'
>>> print (s.translate(map))
54cbaabc789
>>> print (s.translate(map,'123'))#unicode字串不支援刪除
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: translate() takes exactly one argument (2 given)
>>> t=bytes.maketrans(b'abc',b'ABC')
>>> print (b'abc123'.translate(t,b"123"))#必須是bytes字串才能刪除
b'ABC'
>>> print (b'abc321'.translate(t,b"123"))
b'ABC'
7.20 字元的編碼和解碼
>>> '中國'.encode('gbk')
b'\xd6\xd0\xb9\xfa'
>>> '中國'.encode('gbk').decode('gbk')
'中國'
>>> import chardet
>>> chardet.detect('中國人民從此富裕起來了'.encode('gbk'))
{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}
>>> "中國".encode("gbk")
b'\xd6\xd0\xb9\xfa'
>>> s = b'\xd6\xd0\xb9\xfa'
>>> s #直接列印輸出的還是
b'\xd6\xd0\xb9\xfa'
>>> s.decode('gbk')
'中國'
>>> import base64
>>> encodestr = base64.b64encode(b'I love you')
>>> print(encodestr)
b'SSBsb3ZlIHlvdQ=='
>>> print(base64.b64decode(encodestr))
b'I love you'
7.21 chr/ord:字元和ascii碼轉換
py2只能是ascii碼,py3可以是中文,但是隻能是一個
>>> ord('中')
20013
>>> chr(20013)
'中'
中文的ascii碼:
>>> s = '中'
>>> repr(s)
"'中'"
>>> ord(s)
20013
>>> chr(10015)
'✟'
>>> chr(10016)
'✠'
>>> chr(20016)
'豐'
>>> chr(20015)
'丯'
>>> chr(20017)
'丱'
>>>
7.22 count():統計字元中元素出現的個數
用法:s.count(substr, [start, [end]])
作用:計算substr在s[start, [end]]中出現的次數
>>> 'abddddddnalendd'.count('d')
8
>>> 'abddddddnalendd'.count('a')
2
>>> s = 'boy boy boy'
>>> s.count('b',3)
2
>>> s.count('b',3,6)
1
7.23 +操作符效率不高,可以用以下方法代替:
join()或format()
join():
>>> ''.join(['a','b'])
'ab'
format:
>>> 'abc{}'.format('x')
'abcx'
>>> 'abc{1}{0}'.format('x','y')
'abcyx'
7.24 string模組
>>> import string
>>> string.ascii_lowercase
'abcdefghijklmnopqrstuvwxyz'
>>> string.ascii_uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>[email protected][\\]^_`{|}~'
>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.digits
'0123456789'