天天看點

python資料處理常用函數_Python中常用操作字元串的函數與方法總結

Python中常用操作字元串的函數與方法總結

這篇文章主要介紹了Python中常用操作字元串的函數與方法總結,包括字元串的格式化輸出與拼接等基礎知識,需要的朋友可以參考下

例如這樣一個字元串 Python,它就是幾個字元:P,y,t,h,o,n,排列起來。這種排列是非常嚴格的,不僅僅是字元本身,而且還有順序,換言之,如果某個字元換了,就程式設計一個新字元串了;如果這些字元順序發生變化了,也成為了一個新字元串。

在 Python 中,把像字元串這樣的對象類型(後面還會冒出來類似的其它有這種特點的對象類型,比如清單),統稱為序列。顧名思義,序列就是“有序排列”。

比如水泊梁山的 108 個好漢(裡面分明也有女的,難道女漢子是從這裡來的嗎?),就是一個“有序排列”的序列。從老大宋江一直排到第 108 位金毛犬段景住。在這個序列中,每個人有編号,編号和每個人一一對應。1 号是宋江,2 号是盧俊義。反過來,通過每個人的姓名,也能找出他對應的編号。武松是多少号?14 号。李逵呢?22 号。

在 Python 中,給這些編号取了一個文雅的名字,叫做索引(别的程式設計語言也這麼稱呼,不是 Python 獨有的。)。

索引和切片

前面用梁山好漢的為例說明了索引。再看 Python 中的例子:

>>> lang = "study Python"

>>> lang[0]

's'

>>> lang[1]

't'

有一個字元串,通過指派語句賦給了變量 lang。如果要得到這個字元串的第一個單詞 s,可以用 lang[0]。當然,如果你不願意通過指派語句,讓變量 lang 來指向那個字元串,也可以這樣做:

>>> "study Python"[0]

's'

效果是一樣的。因為 lang 是标簽,就指向了 "study Python" 字元串。當讓 Python 執行 lang[0] 的時候,就是要轉到那個字元串對象,如同上面的操作一樣。隻不過,如果不用 lang 這麼一個變量,後面如果再寫,就費筆墨了,要每次都把那個字元串寫全了。為了省事,還是複制給一個變量吧。變量就是字元串的代表了。

字元串這個序列的排序方法跟梁山好漢有點不同,第一個不是用數字1表示,而是用數字 0 表示。不僅僅 Python,其它很多語言都是從 0 開始排序的。為什麼這樣做呢?這就是規定。當然,這個規定是有一定優勢的。此處不展開,有興趣的網上去 google 一下,有專門對此進行解釋的文章。

python資料處理常用函數_Python中常用操作字元串的函數與方法總結

上面的表格中,将這個字元串從第一個到最後一個進行了排序,特别注意,兩個單詞中間的那個空格,也占用了一個位置。

通過索引能夠找到該索引所對應的字元,那麼反過來,能不能通過字元,找到其在字元串中的索引值呢?怎麼找?

>>> lang.index("p")

6

就這樣,是不是已經能夠和梁山好漢的例子對上号了?隻不過差別在于第一個的索引值是 0。

如果某一天,宋大哥站在大石頭上,向着各位弟兄大喊:“兄弟們,都排好隊。”等兄弟們排好之後,宋江說:“現在給各位沒有老婆的兄弟配置設定女朋友,我這裡已經有了名單,我念叨的兄弟站出來。不過我是按照序号來念的。第 29 号到第 34 号先出列,到旁邊房子等候配置設定女朋友。”

在前面的例子中 lang[1] 能夠得到原來字元串的第二個字元 t,就相當于從原來字元串中把這個“切”出來了。不過,我們這麼“切”卻不影響原來字元串的完整性,當然可以了解為将那個字元 t 指派一份拿出來了。

那麼宋江大哥沒有一個一個“切”,而是一下将幾個兄弟叫出來。在 Python 中也能做類似事情。

>>> lang

'study Python' #在前面“切”了若幹的字元之後,再看一下該字元串,還是完整的。

>>> lang[2:9]

'udy pyt'

通過 lang[2:9]要得到部分(不是一個)字元,從傳回的結果中可以看出,我們得到的是序号分别對應着 2,3,4,5,6,7,8(跟上面的表格對應一下)字元(包括那個空格)。也就是,這種獲得部分字元的方法中,能夠得到開始需要的以及最後一個序号之前的所對應的字元。有點拗口,自己對照上面的表格數一數就知道了。簡單說就是包括開頭,不包括結尾。

上述,不管是得到一個還是多個,通過索引得到字元的過程,稱之為切片。

切片是一個很有意思的東西。可以“切”出不少花樣呢?

>>> lang

'study Python'

>>> b = lang[1:] # 得到從 1 号到最末尾的字元,這時最後那個需要不用寫

>>> b

'tudy Python'

>>> c = lang[:] # 得到所有字元

>>> c

'study Python'

>>> d = lang[:10] # 得到從第一個到 10 号之前的字元

>>> d

'study pyth'

在擷取切片的時候,如果分号的前面或者後面的序号不寫,就表示是到最末(後面的不寫)或第一個(前面的不寫)

lang[:10]的效果和 lang[0:10]是一樣的。

>>> e = lang[0:10]

>>> e

'study pyth'

那麼,lang[1:]和 lang[1:11]效果一樣嗎?請思考後作答。

>>> lang[1:11]

'tudy pytho'

>>> lang[1:]

'tudy python'

果然不一樣,你思考對了嗎?原因就是前述所說的,如果分号後面有數字,所得到的切片,不包含該數字所對應的序号(前包括,後不包括)。那麼,是不是可以這樣呢?lang[1:12],不包括 12 号(事實沒有 12 号),是不是可以得到 1 到 11 号對應的字元呢?

>>> lang[1:12]

'tudy python'

>>> lang[1:13]

'tudy python'

果然是。并且不僅僅後面寫 12,寫 13,也能得到同樣的結果。但是,我這個特别要提醒,這種獲得切片的做法在程式設計實踐中是不提倡的。特别是如果後面要用到循環的時候,這樣做或許在什麼時候遇到麻煩。

如果在切片的時候,冒号左右都不寫數字,就是前面所操作的 c = lang[:],其結果是變量 c 的值與原字元串一樣,也就是“複制”了一份。注意,這裡的“複制”我打上了引号,意思是如同複制,是不是真的複制呢?可以用下面的方式檢驗一下

>>> id(c)

3071934536L

>>> id(lang)

3071934536L

id()的作用就是檢視該對象在記憶體位址(就是在記憶體中的位置編号)。從上面可以看出,兩個的記憶體位址一樣,說明 c 和 lang 兩個變量指向的是同一個對象。用 c=lang[:]的方式,并沒有生成一個新的字元串,而是将變量 c 這個标簽也貼在了原來那個字元串上了。

>>> lang = "study python"

>>> c = lang

如果這樣操作,變量 c 和 lang 是不是指向同一個對象呢?或者兩者所指向的對象記憶體位址如何呢?看官可以自行檢視。

字元串基本操作

字元串是一種序列,所有序列都有如下基本操作:

len():求序列長度

:連接配接 2 個序列

: 重複序列元素

in :判斷元素是否存在于序列中

max() :傳回最大值

min() :傳回最小值

cmp(str1,str2) :比較 2 個序列值是否相同

通過下面的例子,将這幾個基本操作在字元串上的使用示範一下:

“+”連接配接字元串

>>> str1 + str2

'abcdabcde'

>>> str1 + "-->" + str2

'abcd-->abcde'

這其實就是拼接,不過在這裡,看官應該有一個更大的觀念,我們現在隻是學了字元串這一種序列,後面還會遇到清單、元組兩種序列,都能夠如此實作拼接。

in

>>> "a" in str1

True

>>> "de" in str1

False

>>> "de" in str2

True

in 用來判斷某個字元串是不是在另外一個字元串内,或者說判斷某個字元串内是否包含某個字元串,如果包含,就傳回 True,否則傳回 False。

最值

>>> max(str1)

'd'

>>> max(str2)

'e'

>>> min(str1)

'a'

一個字元串中,每個字元在計算機内都是有編碼的,也就是對應着一個數字,min()和 max()就是根據這個數字裡獲得最小值和最大值,然後對應出相應的字元。關于這種編号是多少,看官可以 google 有關字元編碼,或者 ASCII 編碼什麼的,很容易查到。

比較

>>> cmp(str1, str2)

-1

将兩個字元串進行比較,也是首先将字元串中的符号轉化為對一個的數字,然後比較。如果傳回的數值小于零,說明第一個小于第二個,等于 0,則兩個相等,大于 0,第一個大于第二個。為了能夠明白其是以然,進入下面的分析。

>>> ord('a')

97

>>> ord('b')

98

>>> ord(' ')

32

ord()是一個内建函數,能夠傳回某個字元(注意,是一個字元,不是多個字元組成的串)所對一個的 ASCII 值(是十進制的),字元 a 在 ASCII 中的值是 97,空格在 ASCII 中也有值,是 32。順便說明,反過來,根據整數值得到相應字元,可以使用 chr():

>>> chr(97)

'a'

>>> chr(98)

'b'

于是,就得到如下比較結果了:

>>> cmp("a","b") #a-->97, b-->98, 97 小于 98,是以 a 小于 b

-1

>>> cmp("abc","aaa")

1

>>> cmp("a","a")

看看下面的比較,是怎麼進行的呢?

>>> cmp("ad","c")

-1

在字元串的比較中,是兩個字元串的第一個字元先比較,如果相等,就比較下一個,如果不相等,就傳回結果。直到最後,如果還相等,就傳回 0。位數不夠時,按照沒有處理(注意,沒有不是 0,0 在 ASCII 中對應的是 NUL),位數多的那個天然大了。ad 中的 a 先和後面的 c 進行比較,顯然 a 小于 c,于是就傳回結果 -1。如果進行下面的比較,是最容易讓人迷茫的。看官能不能根據剛才闡述的比較遠離了解呢?

>>> cmp("123","23")

-1

>>> cmp(123,23) # 也可以比較整數,這時候就是整數的直接比較了。

1

“*”

字元串中的“乘法”,這個乘法,就是重複那個字元串的含義。在某些時候很好用的。比如我要列印一個華麗的分割線:

>>> str1*3

'abcdabcdabcd'

>>> print "-"*20 # 不用輸入很多個`-`

--------------------

len()

要知道一個字元串有多少個字元,一種方法是從頭開始,盯着螢幕數一數。哦,這不是計算機在幹活,是鍵客在幹活。

鍵客,不是劍客。劍客是以劍為武器的俠客;而鍵客是以鍵盤為武器的俠客。當然,還有賤客,那是賤人的最高境界,賤到大俠的程度,比如嶽不群之流。

鍵客這樣來數字元串長度:

>>> a="hello"

>>> len(a)

5

使用的是一個函數 len(object)。得到的結果就是該字元串長度。

>>> m = len(a) # 把結果傳回後指派給一個變量

>>> m

5

>>> type(m) # 這個傳回值(變量)是一個整數型

字元串格式化輸出

什麼是格式化?在維基百科中有專門的詞條,這麼說的:

格式化是指對磁盤或磁盤中的分區(partition)進行初始化的一種操作,這種操作通常會導緻現有的磁盤或分區中所有的檔案被清除。

不知道你是否知道這種“格式化”。顯然,此格式化非我們這裡所說的,我們說的是字元串的格式化,或者說成“格式化字元串”,都可以,表示的意思就是:

格式化字元串,是 C、C++ 等程式設計語言 printf 類函數中用于指定輸出參數的格式與相對位置的字元串參數。其中的轉換說明(conversion specification)用于把随後對應的 0 個或多個函數參數轉換為相應的格式輸出;格式化字元串中轉換說明以外的其它字元原樣輸出。

這也是來自維基百科的定義。在這個定義中,是用 C 語言作為例子,并且用了其輸出函數來說明。在 Python 中,也有同樣的操作和類似的函數 print,此前我們已經了解一二了。

如果将那個定義說的通俗一些,字元串格式化化,就是要先制定一個模闆,在這個模闆中某個或者某幾個地方留出空位來,然後在那些空位填上字元串。那麼,那些空位,需要用一個符号來表示,這個符号通常被叫做占位符(僅僅是占據着那個位置,并不是輸出的内容)。

>>> "I like %s"

'I like %s'

在這個字元串中,有一個符号:%s,就是一個占位符,這個占位符可以被其它的字元串代替。比如:

>>> "I like %s" % "python"

'I like python'

>>> "I like %s" % "Pascal"

'I like Pascal'

這是較為常用的一種字元串輸出方式。

另外,不同的占位符,會表示那個位置應該被不同類型的對象填充。下面列出許多,供參考。不過,不用記憶,常用的隻有 %s 和 %d,或者再加上 %f,其它的如果需要了,到這裡來查即可。

python資料處理常用函數_Python中常用操作字元串的函數與方法總結

看例子:

>>> a = "%d years" % 15

>>> print a

15 years

當然,還可以在一個字元串中設定多個占位符,就像下面一樣

>>> print "Suzhou is more than %d years. %s lives in here." % (2500, "qiwsir")

Suzhou is more than 2500 years. qiwsir lives in here.

對于浮點數字的列印輸出,還可以限定輸出的小數位數和其它樣式。

>>> print "Today's temperature is %.2f" % 12.235

Today's temperature is 12.23

>>> print "Today's temperature is %+.2f" % 12.235

Today's temperature is +12.23

注意,上面的例子中,沒有實作四舍五入的操作。隻是截取。

常用的字元串方法

字元串的方法很多。可以通過 dir 來檢視:

>>> dir(str)

['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

這麼多,不會一一介紹,要了解某個具體的含義和使用方法,最好是使用 help 檢視。舉例:

>>> help(str.isalpha)

Help on method_descriptor:

isalpha(...)

S.isalpha() -> bool

Return True if all characters in S are alphabetic

and there is at least one character in S, False otherwise.

按照這裡的說明,就可以在互動模式下進行實驗。

>>> "python".isalpha() # 字元串全是字母,應該傳回 True

True

>>> "2python".isalpha() # 字元串含非字母,傳回 False

False

split

這個函數的作用是将字元串根據某個分割符進行分割。

>>> a = "I LOVE PYTHON"

>>> a.split(" ")

['I', 'LOVE', 'PYTHON']

這是用空格作為分割,得到了一個名字叫做清單(list)的傳回值,關于清單的内容,後續會介紹。還能用别的分隔嗎?

>>> b = "www.itdiffer.com"

>>> b.split(".")

['www', 'itdiffer', 'com']

去掉字元串兩頭的空格

這個功能,在讓使用者輸入一些資訊的時候非常有用。有的朋友喜歡輸入結束的時候敲擊空格,比如讓他輸入自己的名字,輸完了,他來個空格。有的則喜歡先加一個空格,總做的輸入的第一個字前面應該空兩個格。

這些空格是沒用的。Python 考慮到有不少人可能有這個習慣,是以就幫助程式員把這些空格去掉。

方法是:

S.strip() 去掉字元串的左右空格

S.lstrip() 去掉字元串的左邊空格

S.rstrip() 去掉字元串的右邊空格

例如:

>>> b=" hello " # 兩邊有空格

>>> b.strip()

'hello'

>>> b

' hello '

特别注意,原來的值沒有變化,而是新傳回了一個結果。

>>> b.lstrip() # 去掉左邊的空格

'hello '

>>> b.rstrip() # 去掉右邊的空格

' hello'

字元大小寫的轉換

對于英文,有時候要用到大小寫轉換。最有名駝峰命名,裡面就有一些大寫和小寫的參合。如果有興趣,可以來這裡看自動将字元串轉化為駝峰命名形式的方法。

在 Python 中有下面一堆内建函數,用來實作各種類型的大小寫轉化

S.upper() #S 中的字母大寫

S.lower() #S 中的字母小寫

S.capitalize() # 首字母大寫

S.isupper() #S 中的字母是否全是大寫

S.islower() #S 中的字母是否全是小寫

S.istitle()

看例子:

>>> a = "qiwsir,Python"

>>> a.upper() # 将小寫字母完全變成大寫字母

'QIWSIR,PYTHON'

>>> a # 原資料對象并沒有改變

'qiwsir,Python'

>>> b = a.upper()

>>> b

'QIWSIR,PYTHON'

>>> c = b.lower() # 将所有的小寫字母變成大寫字母

>>> c

'qiwsir,Python'

>>> a

'qiwsir,Python'

>>> a.capitalize() # 把字元串的第一個字母變成大寫

'Qiwsir,Python'

>>> a # 原資料對象沒有改變

'qiwsir,Python'

>>> b = a.capitalize() # 建立立了一個

>>> b

'Qiwsir,Python'

>>> a = "qiwsir,github" # 這裡的問題就是網友白羽毛指出的,非常感謝他。

>>> a.istitle()

False

>>> a = "QIWSIR" # 當全是大寫的時候,傳回 False

>>> a.istitle()

False

>>> a = "qIWSIR"

>>> a.istitle()

False

>>> a = "Qiwsir,github" # 如果這樣,也傳回 False

>>> a.istitle()

False

>>> a = "Qiwsir" # 這樣是 True

>>> a.istitle()

True

>>> a = 'Qiwsir,Github' # 這樣也是 True

>>> a.istitle()

True

>>> a = "Qiwsir"

>>> a.isupper()

False

>>> a.upper().isupper()

True

>>> a.islower()

False

>>> a.lower().islower()

True

再探究一下,可以這麼做:

>>> a = "This is a Book"

>>> a.istitle()

False

>>> b = a.title() # 這樣就把所有單詞的第一個字母轉化為大寫

>>> b

'This Is A Book'

>>> b.istitle() # 判斷每個單詞的第一個字母是否為大寫

True

join 拼接字元串

用“+”能夠拼接字元串,但不是什麼情況下都能夠如願的。比如,将清單(關于清單,後續詳細說,它是另外一種類型)中的每個字元(串)元素拼接成一個字元串,并且用某個符号連接配接,如果用“+”,就比較麻煩了(是能夠實作的,麻煩)。

用字元串的 join 就比較容易實作。

>>> b

'www.itdiffer.com'

>>> c = b.split(".")

>>> c

['www', 'itdiffer', 'com']

>>> ".".join(c)

'www.itdiffer.com'

>>> "*".join(c)

'www*itdiffer*com'

這種拼接,是不是簡單呢?

完 謝謝觀看