Python3 CookBook | 字元串和文本

以下測試代碼全部基於 Python3。

字元串操作在程序中的出現頻率相當高,包括分割,替換,拼接等等,這篇文章介紹五個最常遇到的問題,希望給你帶來一些思考。

1、使用多個界定符分割字元串

分割字元串屬於字元串最基本的操作了,直接用 split() 即可。

In [88]: a = a,b,c,cnnIn [89]: a.split(,)nOut[89]: [a, b, c, c]n

如果一個字元串包含多個不同的分隔符呢?當然可以用 split() 進行多次分割,但這顯然比較麻煩,這時候用 re.split() 是更好的解決辦法。

In [90]: a = a,b c:d,ennIn [91]: import rennIn [92]: re.split(r[,| |:], a)nOut[92]: [a, b, c, d, e]n

re.split() 函數的第一個參數可以根據你的需要,寫出符合要求的正則表達式。

2、字元串開頭或結尾匹配

解決這個問題可以有很多種方法。

第一可以使用切片操作,截取出字元串和要求字元串進行比較;第二可以使用 re.march() 函數,通過寫正則表達式,檢查匹配結果來達到比較目的。

這裡介紹兩個更簡單的函數 startswith() 和 endswith()。

In [93]: a = hello.pynnIn [94]: a.endswith(.py)nOut[94]: TruennIn [95]: a.startswith(h)nOut[95]: Truen

需要注意的是,如果要一次比較多個字元串,所傳入的參數必須是元組,否則會報錯。

In [96]: names = [a.txt, b.py, c, d.py]nnIn [97]: [name for name in names if name.endswith(.py)]nOut[97]: [b.py, d.py]nnIn [98]: [name for name in names if name.endswith(.py, .txt)]n-----------------------------------------------------------------------nTypeError Traceback (most recent call last)n<ipython-input-98-900fc5940b5c> in <module>()n> 1 [name for name in names if name.endswith(.py, .txt)]nn<ipython-input-98-900fc5940b5c> in <listcomp>(.0)n> 1 [name for name in names if name.endswith(.py, .txt)]nnTypeError: slice indices must be integers or None or have an __index__ methodnnIn [99]: [name for name in names if name.endswith((.py, .txt))]nOut[99]: [a.txt, b.py, d.py]n

再來看另一種情況,我們用 Linux 系統 shell 命令時,很喜歡用通配符,比如 ls *.py 來查看文件夾下所有 Python 文件。

在程序中也有兩個函數,fnmatch() 和 fnmatchcase() 來支持這種通配符的操作方式。

In [100]: from fnmatch import fnmatch, fnmatchcasennIn [101]: fnmatch(a.py, *.py)nOut[101]: Truen

由於不同的操作系統,對於模式大小寫匹配規則是不一樣的,所以 fnmatchcase() 函數的作用就是完全按照模式大小寫來匹配。

3、字元串搜索和替換

對於簡單的模式,直接使用 replace() 函數即可。

In [102]: a = hello worldnnIn [103]: a.replace(hello, go)nOut[103]: go worldn

如果是複雜的模式,可以使用 re.sub() 函數。比如你想把 』11/30/2017』 轉換成 』2017-11-30『。

In [104]: a = time is 11/30/2017nnIn [106]: re.sub(r(d+)/(d+)/(d+), r3-1-2, a)nOut[106]: time is 2017-11-30n

sub() 函數第一個參數表示原字元串匹配模式,第二個參數是希望轉換成的模式,反斜杠 3 為前面獲取的組號。

其實這種解決方法歸根結底還是考驗對正則表達式理解程度,如果對正則表達式很熟悉的話,解決這類問題會很輕鬆。

我剛開始工作時用的語言是 Perl,這個語言對文本處理相當強悍,用的最多的就是正則表達式,寫起來也很方便,當時寫過很多很複雜的正則。後來開始寫 Python 之後,感覺寫正則好麻煩,很不習慣。

4、最短匹配和多行匹配模式

這兩個操作所要注意的就兩個方面。

第一,當使用 .* 進行匹配時,所採用的模式為貪婪匹配,如果想要結果為最短匹配,需要寫成非貪婪匹配:.*?

第二,點號是不能匹配換行符的,所以在進行多行匹配時,要寫成:[.|n]

5、字元串格式換

首先說說字元串拼接,如果簡單拼接兩個字元串,加號便可以輕鬆搞定。

In [110]: a = hellonnIn [111]: b = worldnnIn [112]: a + + bnOut[112]: hello worldn

如果拼接一個列表中的字元串呢?可以用 join() 函數。

In [113]: a = [I, have, a, dream]nnIn [114]: .join(a)nOut[114]: I have a dreamn

再來看看這類替換操作:

In [115]: a = {name} is {age}nnIn [116]: a.format(name=Tom, age=18)nOut[116]: Tom is 18n

其實 format() 函數還有很多功能,比如列印的時候就常用它來格式化,有興趣可以進行更多了解。

未完待續。。。


推薦閱讀:

如何評價《Windows 10 development for beginners》的翻譯工作?
我用個假簡歷去面試android的結果為什麼會這樣?
ide和編輯器有什麼區別?
帶你入門Spark(資源整理)
在Linux下,如何強制讓GCC靜態鏈接?

TAG:Python | 编程 | 字符串 |