Python 與字符串相關(guān)的方法可以分為以下兩類:
- 通用操作:可用于多種類型,以內(nèi)置函數(shù)或表達式的方式提供。如
len(s)
s[0]
x in s
等叮趴。 - 只用于字符串類型的操作:以方法調(diào)用形式提供样眠,如
str.split()
str.lower()
等竞滓。
下面,我們就來分類總結(jié)和學(xué)習(xí)一下 Python 中與字符串相關(guān)的操作吹缔。
一. 通用操作
在 Python 中商佑,由于序列的下標(biāo)和切片操作、計算長度和判斷元素是否存在于序列中都是很通用的操作厢塘,不僅適用于字符串茶没,也同樣使用于列表、元組等其它序列晚碾。
因此抓半,對于上述的通用操作,Python 使用內(nèi)置函數(shù)和表達式的方式予以實現(xiàn)格嘁。這樣笛求,相同的方式可以應(yīng)用于列表、元組等其它序列糕簿。
>> s = "hello python"
>> len(s)
12
>> 'python' in s
True
>> 'java' not in s
True
上述操作也同樣適用于列表:
>> L = list(range(5))
>> len(L)
5
>> 3 in L
True
>> '3' not in L
True
Python 對共性的操作提煉成了通用的函數(shù)或表達式探入,而不是為每種類型都提供相應(yīng)的方法。
二.與大小寫有關(guān)的方法
Python 字符串與大小寫有關(guān)的方法總結(jié)如下:
方法 | 釋義 |
---|---|
upper |
將 str 轉(zhuǎn)換為大寫懂诗。 |
lower |
將 str 轉(zhuǎn)換為小寫蜂嗽。 |
isupper |
判斷 str 是否都為大寫。 |
islower |
判斷 str 是否都為小寫殃恒。 |
swapcase |
將 str 中的大寫轉(zhuǎn)換為小寫植旧,小寫轉(zhuǎn)換為大寫。 |
capitalize |
將首字母轉(zhuǎn)換為大寫离唐。 |
istitle |
判斷 str 中是否每個單詞的首字母都大寫病附。 |
示例:
>> 'mia li'.upper()
'MIA LI'
>> 'MIA LI'.lower()
'mia li'
>> 'Mia Li'.isupper()
False
>> 'mia li'.islower()
True
>> 'Mia Li'.swapcase()
'mIA lI'
>> 'hello python'.capitalize()
'Hello python'
>> 'Mia Li'.title()
'Mia Li'
>> 'Mia Li'.istitle()
True
由于 Python 中的字符串時不可變序列,因此這里的方法并沒有改變原來的字符串亥鬓,而是返回了一個新的字符串完沪。
將字符串轉(zhuǎn)換為大寫或小寫是很實用的方法。比如下面的例子:程序等待用戶輸入贮竟,在輸入 yes
YES
Yes
等等時丽焊,執(zhí)行某項操作,否則退出程序咕别。
yes_or_no = input('Please input yes or no: ')
if yes_or_no.lower() == 'yes':
print('do some operations')
else:
print('exit')
三. 判斷類方法
Python 的字符串有很多以 is
開頭的方法技健,如上文提到的 isupper
islower
istitle
;這些都是判斷類的方法惰拱,他們不會產(chǎn)生新的字符串雌贱,并且總是返回 True
或 False
啊送。
方法 | 釋義 |
---|---|
isalpha |
在 str 只包含字母且非空時返回 True ,否則返回 False 欣孤。 |
isalnum |
在 str 只包含字母和數(shù)字且非空時返回 True 馋没,否則返回 False 。 |
issapce |
在 str 只包含空格降传、制表符篷朵、換行符并且非空時返回 True ,否則返回 False 婆排。 |
isdecimal |
在 str 只包含數(shù)字字符且非空時返回 True 声旺,否則返回 False 。 |
startswith |
判斷方法的參數(shù)是否為字符串的前綴段只。 |
endswith |
判斷方法的參數(shù)是否為字符串的后綴腮猖。 |
示例:
>> 'python'.isalpha()
True
>> 'python3'.isalpha()
False
>> 'python3'.isalnum()
True
>> 'python 3'.isalnum()
False
>> 'python 3'.isspace()
False
>> ' \n\t'.isspace()
True
>> 'python 3.6'.isdecimal()
False
>> '3.6'.isdecimal()
False
>> '36'.isdecimal()
True
>> 'python 3.6'.startswith('python')
True
>> 'python 3.6'.startswith('python 3')
True
>> 'python 3.6'.endswith('3.6')
True
下面,我們再看一個更加實用的例子赞枕。系統(tǒng)目錄 /var/log
下面有各種應(yīng)用產(chǎn)生的各種各樣的日志文件澈缺,我們需要找到所有正在記錄的 log
文件:
>>> [ item for item in os.listdir('/var/log') if item.endswith('log')]
['dpkg.log', 'lastlog', 'faillog', 'fontconfig.log', 'auth.log', 'alternatives.log', 'bootstrap.log', 'kern.log', 'syslog', 'mail.log']
可能更常見的場景是獲取某個應(yīng)用的所有日志文件,假設(shè)這里我們需要獲取所有的 syslog
文件炕婶,并計算所有 syslog
文件占用的磁盤大薪闵摹:
>>> syslogs = [ item for item in os.listdir('/var/log') if item.startswith('syslog')]
>>> syslogs
['syslog.5.gz', 'syslog.4.gz', 'syslog.3.gz', 'syslog.2.gz', 'syslog', 'syslog.6.gz', 'syslog.1', 'syslog.7.gz']
>>> sum(os.path.getsize(os.path.join('/var/log', item)) for item in syslogs)
770073
四. 查找類方法
查找類方法用來查找子串在字符串中出現(xiàn)的位置,而它們之間的區(qū)別則是查找的方向不同古话,或者處理異常的方式不同雏吭。下面是 Python 中查找類方法的總結(jié):
方法 | 釋義 |
---|---|
find |
查找子串出現(xiàn)在字符串中的位置锁施,未找到時返回 -1 |
rfind |
與 find 類似陪踩,區(qū)別在于 rfind 是從右向左查找 |
index |
與 find 類似,區(qū)別在于 index 在未找到時拋出 ValueError 異常 |
rindex |
與 index 類似悉抵,區(qū)別在于 rindex 是從右向左查找 |
示例:
>> s = "Beautiful is better than ugly.Explicit is better than implicit."
>> s.find('is better than')
10
>> s.rfind('is better than')
39
>> s.find('python')
-1
此外肩狂,在查找子字符串出現(xiàn)的位置時,還可以指定從哪個位置開始找:
>> s.find('is better than', 11)
39
index
查找子串:
>> s.index('is better than')
10
>> s.rindex('is better than')
39
>> s.index('is better than', 11)
39
>> s.index('python')
ValueError: substring not found
另外姥饰,提醒一下上述方法都是用來查找子串出現(xiàn)在字符串中的位置傻谁,如果是判斷一個字符串是否存在于另一個字符串中,請使用上文提到的操作符 in / not in
列粪。
五. 字符串操作方法
文章的最后审磁,我們來介紹幾個非常重要的字符串操作方法,如下:
方法 | 釋義 |
---|---|
join |
用以連接字符串列表(可迭代對象)岂座,返回一個新的字符串 |
split |
與 join 作用相反态蒂,用以將字符串拆分成字符串列表 |
strip lstrip rstrip
|
分別用于對字符串的兩邊、左邊费什、右邊進行裁剪 |
replace |
將字符串中的子串替換為指定字符串 |
join
調(diào)用 join
函數(shù)的字符串將作為 “分隔符” 插入到待連接字符串的中間:
>> L = ['p', 'y', 't', 'h', 'o', 'n']
>> ''.join(L)
'python'
>> '#'.join(L)
'p#y#t#h#o#n'
join
函數(shù)其實設(shè)計得非常通用钾恢,接收的參數(shù)只要是可迭代對象即可:
比如,我們需要將文件中的內(nèi)容拼接成一個字符串,只需要將文件句柄傳遞給 join
方法即可瘩蚪,因為文件對象本身就是一個可迭代對象:
with open('example.txt') as f:
s = '# '.join(f)
print(s)
運行結(jié)果:
文件內(nèi)容如下:
這里需要提醒一下泉懦,print
函數(shù)在打印多項內(nèi)容時,可以通過 sep
指定分隔符:
>> print('mia', 'x', 2027, 2013)
mia x 2027 2013
>> print('mia', 'x', 2027, 2013, sep=':')
mia:x:2027:2013
因此疹瘦,可不要慣性思維崩哩,使用 join
將字符串列表再拼接一遍。言沐。而且琢锋,由于這里的內(nèi)容不僅僅是字符串,還有兩個整數(shù)呢灶,因此使用 join
拼接打印還會報錯哦:
>> print(':'.join(['mia', 'x', 2027, 2013]))
TypeError: sequence item 2: expected str instance, int found
split
上文我們了解到 join
方法用于將字符串列表(可迭代對象)拼接成一個更大的字符串吴超,而 split
方法則與 join
的作用相反,用以將一個字符串拆分成字符串列表:
>> 'nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin'.split(':')
['nobody',
'x',
'65534',
'65534',
'nobody',
'/nonexistent',
'/usr/sbin/nologin']
用以拆分字符串的 “分隔符” 也可以省略鸯乃,省略時使用空白字符串(空格鲸阻、換行符、制表符)進行拆分:
>> with open('example.txt') as f:
s = f.read(65)
>> print(s)
Beautiful is better than ugly.
Explicit is better than implicit.
>> s.split()
['Beautiful',
'is',
'better',
'than',
'ugly.',
'Explicit',
'is',
'better',
'than',
'implicit.']
strip lstrip rstrip
strip
lstrip
rstrip
用于對字符串進行裁剪缨睡,除了裁剪的范圍不一樣之外鸟悴,沒有任何區(qū)別。split
方法常見的用法即去除字符串兩端的空白:
>> s = ' \t\v\r\n Python 3.7 \t\v\r\n '
>> s.strip()
'Python 3.7'
>> s.lstrip()
'Python 3.7 \t\x0b\r\n '
>> s.rstrip()
' \t\x0b\r\n Python 3.7'
此外奖年,也可以給 strip
傳遞參數(shù)细诸,參數(shù)中的所有字符都將被裁剪:
下面是一個示例:
>> s = '##Hello, Python##'
>> s.strip('#')
'Hello, Python'
>> s.strip('###')
'Hello, Python'
>> s.strip('H#n')
'ello, Pytho'
>> s.strip('nH#')
'ello, Pytho'
注:傳遞給
strip
方法的參數(shù)是需要被裁剪的字符集合,因為是集合陋守,所以字符的順序并不重要震贵,重復(fù)的字符也沒有任何效果。
replace
replace
方法非常簡單水评,顧名思義就是將字符串中的子串替換成指定的字符串:
>> s = '##Hello, Python##'
>> s.replace('##', '***')
'***Hello, Python***'