Python全棧之路系列之字符串數據類型
字符串(str)
字符串類型是python的序列類型,他的本質就是字符序列,而且python的字符串類型是不可以改變的,你無法將原字符串進行修改,但是可以將字符串的一部分復制到新的字符串中,來達到相同的修改效果。
創建字符串類型可以使用單引號或者雙引號又或者三引號來創建,實例如下:
單引號
>>> string = 'ansheng'
type是查看一個變量的數據類型
>>> type(string)
<class 'str'></code></pre>
雙引號
>>> string = "ansheng"
type是查看一個變量的數據類型
>>> type(string)
<class 'str'></code></pre>
三引號
>>> string = """ansheng"""
>>> type(string)
<class 'str'>
還可以指定類型
>>> var=str("string")
>>> var
'string'
>>> type(var)
<class 'str'>
字符串方法
每個類的方法其實都是很多的,無論我們在學習的過程中個還是工作的時候,常用的其實沒有多少,所以我們沒必要去可以得記那么多,有些方法我們只需要對其有個印象就ok了,忘了的時候可以google一下。
首字母變大寫
capitalize(self):
>>> name="ansheng"
>>> name.capitalize()
'Ansheng'
內容居中,width:字符串的總寬度;fillchar:填充字符,默認填充字符為空格。
center(self, width, fillchar=None):
# 定義一個字符串變量,名為"string",內容為"hello word"
>>> string="hello word"
輸出這個字符串的長度,用len(value_name)
>>> len(string)
10
字符串的總寬度為10,填充的字符為"*"
>>> string.center(10,"*")
'hello word'
如果設置字符串的總產都為11,那么減去字符串長度10還剩下一個位置,這個位置就會被*所占用
>>> string.center(11,"")
'hello word'
是從左到右開始填充
>>> string.center(12,"")
'hello word*'</code></pre>
統計字符串里某個字符出現的次數,可選參數為在字符串搜索的開始與結束位置。
count(self, sub, start=None, end=None):
參數
描述
sub
搜索的子字符串;
start
字符串開始搜索的位置。默認為第一個字符,第一個字符索引值為0;
end
字符串中結束搜索的位置。字符中第一個字符的索引為 0。默認為字符串的最后一個位置;
>>> string="hello word"
默認搜索出來的"l"是出現過兩次的
>>> string.count("l")
2
如果指定從第三個位置開始搜索,搜索到第六個位置,"l"則出現過一次
>>> string.count("l",3,6)
1</code></pre>
解碼
decode(self, encoding=None, errors=None):
# 定義一個變量內容為中文
temp = "中文"
把變量的字符集轉化為UTF-8
temp_unicode = temp.decode("utf-8")</code></pre>
編碼,針對unicode
encode(self, encoding=None, errors=None):
# 定義一個變量內容為中文,字符集為UTF-8
temp = u"中文"
編碼,需要指定要轉換成什么編碼
temp_gbk = temp_unicode.encode("gbk")</code></pre>
于判斷字符串是否以指定后綴結尾,如果以指定后綴結尾返回True,否則返回False。
endswith(self, suffix, start=None, end=None):
參數
描述
suffix
后綴,可能是一個字符串,或者也可能是尋找后綴的tuple
start
開始,切片從這里開始
end
結束,片到此為止
>>> string="hello word"
判斷字符串中是否已"d"結尾,如果是則返回"True"
>>> string.endswith("d")
True
判斷字符串中是否已"t"結尾,不是則返回"False"
>>> string.endswith("t")
False
制定搜索的位置,實則就是從字符串位置1到7來進行判斷,如果第七個位置是"d",則返回True,否則返回False
>>> string.endswith("d",1,7)
False</code></pre>
把字符串中的tab符號('t')轉為空格,tab符號('t')默認的空格數是8。
expandtabs(self, tabsize=None):
參數
描述
tabsize
指定轉換字符串中的 tab 符號('t')轉為空格的字符數
>>> string="hello word"
輸出變量"string"內容的時候會發現中間有一個"\t",這個其實就是一個tab
鍵
>>> string
'hello\tword'
把tab
鍵換成一個空格
>>> string.expandtabs(1)
'hello word'
把tab
鍵換成十個空格
>>> string.expandtabs(10)
'hello word'</code></pre>
檢測字符串中是否包含子字符串str,如果指定beg(開始)和end(結束)范圍,則檢查是否包含在指定范圍內,如果包含子字符串返回開始的索引值,否則返回-1。
find(self, sub, start=None, end=None):
參數
描述
str
指定檢索的字符串
beg
開始索引,默認為0
end
結束索引,默認為字符串的長度
>>> string="hello word"
返回o
在當前字符串中的位置,如果找到第一個o
之后就不會再繼續往下面尋找了
>>> string.find("o")
4
從第五個位置開始搜索,返回o
所在的位置
>>> string.find("o",5)
7</code></pre>
字符串格式,后續文章會提到。
format( args, *kwargs):
檢測字符串中是否包含子字符串 str ,如果指定 beg(開始) 和 end(結束) 范圍,則檢查是否包含在指定范圍內,該方法與 python find()方法一樣,只不過如果str不在 string中會報一個異常。
index(self, sub, start=None, end=None):
參數
描述
str
指定檢索的字符串
beg
開始索引,默認為0
end
結束索引,默認為字符串的長度
>>> string="hello word"
返回字符串所在的位置
>>> string.index("o")
4
如果查找一個不存在的字符串那么就會報錯
>>> string.index("a")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found</code></pre>
法檢測字符串是否由字母和數字組成,如果string至少有一個字符并且所有字符都是字母或數字則返回True,否則返回False
isalnum(self):
>>> string="hes2323"
如果存在數字或字母就返回True
,否則返回False
>>> string.isalnum()
True
中間有空格返回的就是False了
>>> string="hello word"
>>> string.isalnum()
False</code></pre>
檢測字符串是否只由字母組成。
isalpha(self):
# 如果全部都是字母就返回True
>>> string="helloword"
>>> string.isalpha()
True
否則就返回False
>>> string="hes2323"
>>> string.isalpha()
False</code></pre>
檢測字符串是否只由數字組成
isdigit(self):
# 如果變量里面都是數字就返回`True`,否則就返回`False`
>>> string="hes2323"
>>> string.isdigit()
False
>>> string="2323"
>>> string.isdigit()
True
檢測字符串是否由小寫字母組成
islower(self):
# 如果變量內容全部都是小寫字母就返回`True`,否則就返回`False`
>>> string="hesasdasd"
>>> string.islower()
True
>>> string="HelloWord"
>>> string.islower()
False
檢測字符串是否只由空格組成
isspace(self):
# 如果變量內容由空格來組成,那么就返回`True`否則就返回`False`
>>> string=" "
>>> string.isspace()
True
>>> string="a"
>>> string.isspace()
False
檢測字符串中所有的單詞拼寫首字母是否為大寫,且其他字母為小寫。
istitle(self):
# 如果變量的內容首字母是大寫并且其他字母為小寫,那么就返回`True`,否則會返回`False`
>>> string="Hello Word"
>>> string.istitle()
True
>>> string="Hello word"
>>> string.istitle()
False
檢測字符串中所有的字母是否都為大寫。
isupper(self):
# 如果變量值中所有的字母都是大寫就返回`True`,否則就返回`False`
>>> string="hello word"
>>> string.isupper()
False
>>> string="HELLO WORD"
>>> string.isupper()
True
將序列中的元素以指定的字符連接生成一個新的字符串。
join(self, iterable):
>>> string=("a","b","c")
>>> '-'.join(string)
'a-b-c'
返回一個原字符串左對齊,并使用空格填充至指定長度的新字符串。如果指定的長度小于原字符串的長度則返回原字符串。
ljust(self, width, fillchar=None):
參數
描述
width
指定字符串長度
fillchar
填充字符,默認為空格
>>> string="helo word"
>>> len(string)
9
定義的長度減去字符串的長度,剩下的就開始填充
>>> string.ljust(15,'*')
'helo word**'</code></pre>
轉換字符串中所有大寫字符為小寫。
lower(self):
# 把變量里的大寫全部轉換成小寫
>>> string="Hello WORD"
>>> string.lower()
'hello word'
截掉字符串左邊的空格或指定字符
lstrip(self, chars=None):
參數
描述
chars
指定截取的字符
# 從左側開始刪除匹配的字符串
>>> string="hello word"
>>> string.lstrip("hello ")
'word'
用來根據指定的分隔符將字符串進行分割,如果字符串包含指定的分隔符,則返回一個3元的tuple,第一個為分隔符左邊的子串,第二個為分隔符本身,第三個為分隔符右邊的子串。
partition(self, sep):
參數
描述
str
指定的分隔符
# 返回的是一個元組類型
>>> string="www.ansheng.me"
>>> string.partition("ansheng")
('www.', 'ansheng', '.me')
把字符串中的 old(舊字符串)替換成new(新字符串),如果指定第三個參數max,則替換不超過max次
replace(self, old, new, count=None):
參數
描述
old
將被替換的子字符串
new
新字符串,用于替換old子字符串
count
可選字符串, 替換不超過count次
>>> string="www.ansheng.me"
把就字符串www.
換成新字符串https://
>>> string.replace("www.","https://")
'
就字符串w
換成新字符串a
只替換2
次
>>> string.replace("w","a",2)
'aaw.ansheng.me'</code></pre>
返回字符串最后一次出現的位置,如果沒有匹配項則返回-1。
rfind(self, sub, start=None, end=None):
參數
描述
str
查找的字符串
beg
開始查找的位置,默認為0
end
結束查找位置,默認為字符串的長度
>>> string="hello word"
rfind其實就是反向查找
>>> string.rfind("o")
7
指定查找的范圍
>>> string.rfind("o",0,6)
4</code></pre>
返回子字符串str在字符串中最后出現的位置,如果沒有匹配的字符串會報異常,你可以指定可選參數 [beg:end] 設置查找的區間。
rindex(self, sub, start=None, end=None):
參數
描述
str
查找的字符串
beg
開始查找的位置,默認為0
end
結束查找位置,默認為字符串的長度
>>> string="hello word"
反向查找索引
>>> string.rindex("o")
7
如果沒有查找到就報錯
>>> string.rindex("a")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found</code></pre>
返回一個原字符串右對齊,并使用空格填充至長度 width 的新字符串。如果指定的長度小于字符串的長度則返回原字符串。
rjust(self, width, fillchar=None):
參數
描述
width
指定填充指定字符后中字符串的總長度
fillchar
填充的字符,默認為空格
>>> string="hello word"
>>> len(string)
10
>>> string.rjust(10,"*")
'hello word'
>>> string.rjust(12,"*")
'**hello word'
從右到左通過指定分隔符對字符串進行切片,如果參數num有指定值,則僅分隔num個子字符串
rsplit(self, sep=None, maxsplit=None):
參數
描述
str
隔符,默認為空格
num
分割次數
>>> string="www.ansheng.me"
>>> string.rsplit(".",1)
['www.ansheng', 'me']
>>> string.rsplit(".",2)
['www', 'ansheng', 'me']
刪除string字符串末尾的指定字符(默認為空格).
rstrip(self, chars=None):
參數
描述
chars
指定刪除的字符
# 從尾部開始匹配刪除
>>> string="hello word"
>>> string.rstrip("d")
'hello wor'
從左到右通過指定分隔符對字符串進行切片,如果參數num有指定值,則僅分隔num個子字符串
split(self, sep=None, maxsplit=None):
參數
描述
str
分隔符,默認為空格
num
分割次數
>>> string="www.ansheng.me"
指定切一次,以.
來分割
>>> string.split(".",1)
['www', 'ansheng.me']
指定切二次,以.
來分割
>>> string.split(".",2)
['www', 'ansheng', 'me']</code></pre>
按照行分隔,返回一個包含各行作為元素的列表,如果num指定則僅切片num個行.
splitlines(self, keepends=False):
參數
描述
num
分割行的次數
# 定義一個有換行的變量,\n
可以劃行
>>> string="www\nansheng\nme"
輸出內容
>>> print(string)
www
ansheng
me
把有行的轉換成一個列表
>>> string.splitlines(1)
['www\n', 'ansheng\n', 'me']</code></pre>
檢查字符串是否是以指定子字符串開頭,如果是則返回 True,否則返回 False。如果參數 beg 和 end 指定值,則在指定范圍內檢查。
startswith(self, prefix, start=None, end=None):
參數
描述
str
檢測的字符串
strbeg
可選參數用于設置字符串檢測的起始位置
strend
可選參數用于設置字符串檢測的結束位置
>>> string="www.ansheng.me"
>>> string.startswith("www")
True
>>> string.startswith("www",3)
False
移除字符串頭尾指定的字符(默認為空格)
strip(self, chars=None):
參數
描述
chars
移除字符串頭尾指定的字符
>>> string=" www.ansheng.me "
>>> string
' www.ansheng.me '
刪除空格
>>> string.strip()
'www.ansheng.me'
>>> string="www.ansheng.me"
指定要把左右兩邊的"_"刪除掉
>>> string.strip("_")
'www.ansheng.me'</code></pre>
用于對字符串的大小寫字母進行轉換,大寫變小寫,小寫變大寫
swapcase(self):
>>> string="hello WORD"
>>> string.swapcase()
'HELLO word'
返回"標題化"的字符串,就是說所有單詞都是以大寫開始,其余字母均為小寫。
title(self):
>>> string="hello word"
>>> string.title()
'Hello Word'
根據參數table給出的表(包含 256 個字符)轉換字符串的字符, 要過濾掉的字符放到 del 參數中。
translate(self, table, deletechars=None):
參數
描述
table
翻譯表,翻譯表是通過maketrans方法轉換而來
deletechars
字符串中要過濾的字符列表
將字符串中的小寫字母轉為大寫字母
upper(self):
>>> string="hello word"
>>> string.upper()
'HELLO WORD'
返回指定長度的字符串,原字符串右對齊,前面填充0
zfill(self, width):
參數
描述
width
指定字符串的長度。原字符串右對齊,前面填充0
>>> string="hello word"
>>> string.zfill(10)
'hello word'
>>> string.zfill(20)
'0000000000hello word'
去除值得兩端空格
>>> var=" ansheng "
>>> var
' ansheng '
>>> var.strip()
'ansheng'
str類型和bytes類型轉換
以UTF-8編碼的時候,一個漢字是三個字節,一個字節是八位
3.5.x實例
代碼如下:
#!/usr/bin/env python
* coding:utf-8 *
var = "中文"
for n in var:
print(n)
print("================")
var2 = "zhongwen"
for n in var2:
print(n)</code></pre>
執行結果:
C:\Python35\python.exe F:/Python_code/sublime/Day03/str.py
中
文
z
h
o
n
g
w
e
n</code></pre>
2.7.x實例
代碼如下:
#!/usr/bin/env python
* coding:utf-8 *
var = "中文"
for n in var:
print(n)
print("================")
var2 = "zhongwen"
for n in var2:
print(n)</code></pre>
執行結果
C:\Python27\python.exe F:/Python_code/sublime/Day03/str.py
?
?
?
?
?
?
z
h
o
n
g
w
e
n</code></pre>
通過上面的實例可以知道, Python3.5.x 在輸出中文或者英文的時候是按照一個字符一個字符來輸出的,但是在 Python2.7.x 就不這樣了, Python2.7.x 是按照字節來進行輸出的,可以看到在輸出中文的時候是亂碼的,而且還輸出了六次,因為在UTF-8編碼的情況下一個漢字是等于三個字節的,所以輸出了六個亂碼的字符。
在Python3.5.x里面是既可以輸出漢字,也可以把輸出字節的,利用bytes這個方法,bytes可以將字符串轉換為字節
var="中文"
for n in var:
print(n)
bytes_list = bytes(n, encoding='utf-8')
# 十六進制輸出
print(bytes_list)
for x in bytes_list:
# 十進制,bin(x)二進制
print(x,bin(x))</code></pre>
輸出的結果
# 字符串
中
# 十六進制
b'\xe4\xb8\xad'
# 228=十進制,0b11100100=二進制
228 0b11100100
184 0b10111000
173 0b10101101
文
b'\xe6\x96\x87'
230 0b11100110
150 0b10010110
135 0b10000111
b代表十六進制,xe4這樣的是一個十六進制的字節
其他知識點
索引
索引是指某個值在列表或別的數據類型中的一個位置
定義一個列表,查看列表中 Linux 值對應在列表中的位置
>>> list_os = ["Windows","Linux","Mac","Unix"]
>>> list_os.index("Linux")
1
>>> list_os[1]
'Linux'
使用 \ 轉義
Python允許你對某些字符進行轉義,以此來實現一些難以單純用字符描述的效果
# 常用的內容也轉義也就是`\n`和`\t`了,`\n`是用來換行的,`\t`是用來代替一個`tab`鍵
>>> string="My \n Name \t is"
>>> print(string)
My
Name is
使用 + 拼接
你可以使用 + 號將多個字符串或字符串變量拼接起來
>>> a="my "
>>> b="name "
>>> c="is "
>>> d="ansheng"
>>> a+b+c+d
'my name is ansheng'
切片
切片操作符是序列名后跟一個方括號,方括號中有一對可選的數字,并用冒號分割。注意這與你使用的索引操作符十分相似。記住數是可選的,而冒號是必須的,切片操作符中的第一個數表示切片開始的位置,第二個數表示切片到哪里結束,第三個數表示切片間隔數。如果不指定第一個數,Python就從序列首開始。如果沒有指定第二個數,則Python會停止在序列尾。注意,返回的序列從開始位置開始 ,剛好在結束位置之前結束。即開始位置是包含在序列切片中的,而結束位置被排斥在切片外。
>>> os="Linux"
>>> os
'Linux'
>>> os[0:2]
'Li'
>>> os[0:4:2]
'Ln'
更多實例如下
切片符
說明
[:]
提取從開頭到結尾的整個字符串
[start:]
從start到結尾的字符串
[:end]
從開頭提取到end - 1
[start:end]
從start提取到end - 1
[startsetp]
從start提取到end-1,每setp個字符提取一個
索引和切片同時適用于字符串、列表與元組
-
索引通常用于查找某一個字符串或值
-
切片通常用于查找某一個范圍內的字符串或值
實例:
# 定義一個列表,列表內有三個元素
>>> var=["Linux","Win","Unix"]
# 通過索引取到了一個值
>>> var[0]
'Linux'
# 通過切片取到了多個值
>>> var[0:2]
['Linux', 'Win']
>>> var[1:3]
['Win', 'Unix']
來自:https://segmentfault.com/a/1190000008078178