Python 字符串 ~ 字符串函數(shù)

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)生新的字符串雌贱,并且總是返回 TrueFalse啊送。

方法 釋義
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***'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猩系,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子中燥,更是在濱河造成了極大的恐慌寇甸,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疗涉,死亡現(xiàn)場離奇詭異拿霉,居然都是意外死亡,警方通過查閱死者的電腦和手機咱扣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門绽淘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人偏窝,你說我怎么就攤上這事收恢∥溲В” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵伦意,是天一觀的道長火窒。 經(jīng)常有香客問我,道長驮肉,這世上最難降的妖魔是什么熏矿? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮离钝,結(jié)果婚禮上票编,老公的妹妹穿的比我還像新娘。我一直安慰自己卵渴,他們只是感情好慧域,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浪读,像睡著了一般昔榴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碘橘,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天互订,我揣著相機與錄音,去河邊找鬼痘拆。 笑死仰禽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纺蛆。 我是一名探鬼主播吐葵,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼犹撒!你這毒婦竟也來了折联?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤识颊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奕坟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祥款,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年月杉,在試婚紗的時候發(fā)現(xiàn)自己被綠了刃跛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡苛萎,死狀恐怖桨昙,靈堂內(nèi)的尸體忽然破棺而出检号,到底是詐尸還是另有隱情,我是刑警寧澤蛙酪,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布齐苛,位于F島的核電站,受9級特大地震影響桂塞,放射性物質(zhì)發(fā)生泄漏凹蜂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一阁危、第九天 我趴在偏房一處隱蔽的房頂上張望玛痊。 院中可真熱鬧,春花似錦狂打、人聲如沸擂煞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颈娜。三九已至,卻和暖如春浙宜,著一層夾襖步出監(jiān)牢的瞬間官辽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工粟瞬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留同仆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓裙品,卻偏偏與公主長得像俗批,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子市怎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容