1. 程式人生 > >python3基礎:字串

python3基礎:字串

字串

 

目錄

字串

1.字串物件是不可變的

2.用id判斷字串的地址

3.字串的兩種型別:str和bytes

4.元字元r/R:表示後面的字元不需要轉義

​​​​​​​5.換行和轉義

​​​​​​​6.字串格式化

6.1%格式化輸出:

​​​​​​​6.2模板格式化

7.字串常用方法:

7.1  strip()/lstrip()/rstrip():去掉空白字元

​​​​​​​7.2  upper()/lower()/swapcase():大小寫轉換及互換

​​​​​​​7.3  capitalize():將第1個單詞首字母大寫

​​​​​​​7.4  title():將所有單詞首字母大寫

​​​​​​​7.5  ljust()/rjust()/center():左、右、居中對齊

​​​​​​​7.6  zfill():填充

​​​​​​​7.7  find()/rfind():查詢子字串的位置

​​​​​​​7.8  index()/rindex():查詢子字串的位置

​​​​​​​7.9  replace()/expandtabs():替換字串的指定內容

​​​​​​​7.10  split()/rsplit()/splitlines():預設用空白字元切割

​​​​​​​7.11  join():字串連線

​​​​​​​7.12  startswith()/endswith()/in:開頭、結尾是否存在

​​​​​​​7.13  isalpha():是否全部為字母

​​​​​​​7.14  isalnum():是否為數字或字母

​​​​​​​7.15  isdigit():是否全部為數字

​​​​​​​7.16   isspace():是否為空格

​​​​​​​7.17  islower()/isupper()是否為大寫或小寫

​​​​​​​7.18  istitle():

7.19  maketrans()/translate():字串對映

​​​​​​​7.20  字元的編碼和解碼

​​​​​​​​​​​​​​7.21  chr/ord:字元和ascii碼轉換

​​​​​​​​​​​​​​7.22  count():統計字元中元素出現的個數

​​​​​​​​​​​​​​7.23  +操作符效率不高,可以用以下方法代替:

​​​​​​​​​​​​​​7.24  string模組


​​​​​​​

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'