自學Python之Python基礎:(七)字串處理技巧__Python

來源:互聯網
上載者:User

轉載的老闆請註明出處:http://blog.csdn.net/cc_xz/article/details/78693772萬分感謝。

在本篇中,你將瞭解到:
1.如何拆分字串。
2.如何判斷字串首尾。
3.如何將多個字串拼裝成一個字串。
4.如何刪除或替換字串中的字元。

在輸出字串時,可以對字串進行對齊操作,分別使用: str.ljust():用於向靠左對齊。 str.rjust():用於向靠右對齊。 str.center():用於置中對齊。

以上函數接受兩個參數,第一個參數為填充的元素數量,第二個參數為填充的元素類型,預設為空白格,例如可以設定等號、冒號等。


根據分隔字元拆分字串:
拆分單一分隔字元字串:

txt = "123,234\n345,456 567,678"print(txt.split(","))#預設使用空白例如\n等分割。也可以在參數中輸入字串指定分割。

輸出結果為:

['123', '234\n345', '456 567', '678']

這種方式僅適用於只有單一分隔字元的情況。

使用Regex分割字串:

import re  # re是Regex模組,該模組中包含了很多關於Regex的函數。str01 = "123,432,325.432.123|231|3123/32443、123,2.432,1|324""""split()函數可以根據Regex來對字串(str類型)進行篩選。在下述代碼中,第一個參數是一段Regex,第二個參數是需要篩選的字串。值得注意的是,split()函數只支援對字串進行篩選,列表、元組等不支援。而split()函數返回的類型是一個list"""list01 = re.split("[,.|、/]+", str01) print(list01)

輸出結果為:

['123', '432', '325', '432', '123', '231', '3123', '32443', '123', '2', '432', '1', '324']

當然,更多的Regex內容,會在後面單獨拿出一篇來進行詳細說明。

判斷字串首尾:
產生隨機字串:

from random import sample, randint  # sample用於從列表中抓取隨機元素;randint用於產生隨機數。# 定義字母列表,用於隨機播放其中的字母組成字串。list01 = ["a", "b", "c", "d", "e", "f", "g", "h", "y", "j", "k", "i", "m", "n", "o", "p", "q"]# 下列推導式為:# 首先使用for迴圈20次,即建立索引為0-19的列表。# 然後使用sample()函數在list01字母列表中隨機抓取字母。# 最後使用randint()函數隨機定義每次隨機抓取字母的數量。list02 = [sample(list01, randint(3, len(list01))) for i in range(20)]list03 = []  # 由於此時list02是2維列表,需要將其轉換為1維列表。將最終的元素放到list03中。for x in range(len(list02)):  # 通過for迴圈得出list02的索引,進行操作。   # join()函數可以將一個可迭代對象轉換為str字串,由於此方法是字串方法,所以需要在前面添加字串對象。   str01 = "".join(list02[x])  # 而建立它的字串對象,可以用於join將可迭代對象轉換為str字串後的分隔字元。   list03.append(str01)print(list03)

輸出結果為:

['fjkpb', 'inpkdeyoqjhcam',.......省略部分結果 'ecak', 'ydkoji']


判斷字串開頭或結尾:

from random import sample, randintlist01 = ["a", "b", "c", "d", "e", "f", "g", "h", "y", "j", "k", "i", "m", "n", "o", "p", "q"]list02 = [sample(list01, randint(3, len(list01))) for i in range(20)]list03 = []for x in range(len(list02)):   str01 = "".join(list02[x])   list03.append(str01)for x in list03:   str(x)   if x.endswith(("a", "b", "c")):  # 接受一個元組為參數,參數中的所有參數都會依次被用來判斷是否以此結尾。      print("以a或b或c結尾的字串為:", x)   elif x.startswith(("a","b","c")):#但endswith()或startswith()只接受字串或元組為參數,不接受列表等。      print("以a或b或c開頭的字串為:", x)

輸出結果為:

以a或b或c開頭的字串為: bqcdpkgaemojfh以a或b或c結尾的字串為: iacb以a或b或c開頭的字串為: cqhfmn以a或b或c結尾的字串為: cmeqinofgpdhyb以a或b或c開頭的字串為: cienm以a或b或c開頭的字串為: cfbyokjq以a或b或c開頭的字串為: aoehgkfmn以a或b或c開頭的字串為: agnohpiycdqjk以a或b或c結尾的字串為: gimkc


調整字串文字格式設定:
如果我們期望將一些字串(例如log、更新資訊等)中的內容調整格式,可以使用re.sub()函數。re.sub()函數可以用於字串替換,利用Regex的擷取的群組,捕獲字串中所有的內容,根據匹配成功的內容,在根據定義好的結果順序進行重新排序。
例如現在開啟一個更新檔案,修改日期的顯示格式:

import retxt = open("Release.txt","r",encoding="utf-8").read()#txt = re.sub("(\d{4})-(\d{2})-(\d{2})",r"\2/\3/\1",txt)"""sub()函數接受3個參數,第一個參數是一段Regex,用於選定需要修改格式的目標元素。第二個元素也是一段Regex,用於設定將元素修改成何種格式。第三個元素是則是要修改的目標字串。而第一個sub()函數和第二個sub()函數的區別在於,第二個函數通過Regex給各個欄位起了一個別名,而在第二個參數中通過別名來選擇目標元素。"""txt = re.sub("(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})",r"\g<month>/\g<day>/\g<year>/",txt)print(txt)

輸出結果為:

日期:08/07/2012/日期:12/20/2011/日期:2011-2-16日期:04/13/2010/日期:11/20/2009/日期:10/27/2009/日期:2009-6-29

上述結果,我們可以發現,在Regex中,定義的第二、第三個欄位都是2個位元組的,而在日期中,凡事同定義的位元組數相同的,均被轉換了格式,而位元組數不同的,則沒有成功匹配。

將多個字串拼裝成一個字串:
當處理一些參數時,可能會需要將將多個零散的字串(可能是參數什麼的)拼裝成一個字串。最簡單的方式為:

list01 = ["<3389>", "<TCP/IP>", "<23ms>", "<1024k>", "<202.106.0.20>", "<49>"]  # 定義一些參數放到列表中。str01 = ""  # 定義一個Null 字元串,用於迭代後的參數放入其中。for x in list01:  # 列表經過迭代後返回的結果x本身即為str類型。   str01 += x  # 如果列表中的值均為str類型,此種方法可行,但如果存在其他類型,例如int類型等,則需要強制轉型。   print(str01)

輸出結果為:

<3389><3389><TCP/IP><3389><TCP/IP><23ms><3389><TCP/IP><23ms><1024k><3389><TCP/IP><23ms><1024k><202.106.0.20><3389><TCP/IP><23ms><1024k><202.106.0.20><49>


使用join()函數拼裝字串:

list01 = ["<3389>", "<TCP/IP>", "<23ms>", "<1024k>", "<202.106.0.20>", "<49>"]  # 定義一些參數放到列表中。str01 = "|".join(list01) #join()函數可以將一個可迭代對象轉換為str字串,由於此方法是字串方法,所以需要在前面添加字串對象。# 而建立它的字串對象,可以用於join將可迭代對象轉換為str字串後的分隔字元。print(str01)

輸出結果為:

<3389>|<TCP/IP>|<23ms>|<1024k>|<202.106.0.20>|<49>


字串相加和join()拼裝耗時:

import timefrom random import sample"""首先通過列表推導式建立一個長度為100萬的二維了列表,每個列表中都有5個子列表。但二維列表並不能直接被join()函數和for遍曆,所以再將對二維列表進行處理,作為普通列表。列表長度為100萬,每個列表元素中有5個字串。"""list01 = [sample("qwertyuiop", 5) for x in range(1, 1000001)]list02 = []for x in range(len(list01)):   str00 = ''.join(list01[x])   list02.append(str00)"""首先確定使用join()函數所需的時間:首先通過time.clock()函數獲得目前時間(開始時間),放到一個變數中。然後使用join()對列表進行處理,將最終的結果放置到str01變數中(str類型)。接著再記錄當前的時間作為結束時間,再放到一個變數中。最後使用結束的時間減去開始的時間,最終得出耗時。"""startTime01 = time.clock()str01 = "".join(list02)endTime01 = time.clock()joinTime01 = endTime01 - startTime01print(joinTime01, "joinTime01")""" 然後確定使用for遍曆配合字串相加的方式:同上,首先確定當前的開始時間,然後定義一個Null 字元串,用於放置需要處理的字串。然後使用for迴圈,對list進行遍曆,然後使用+=符號,將遍曆出的字串放置到字串中。最後是確定結束時間,再得出所需的耗時。"""startTime02 = time.clock()str02 = ""for i in list02:   str02 += i  # 實際上+=操作是調用了字串的__add__()函數。endTime02 = time.clock()joinTime02 = endTime02 - startTime02print(joinTime02, "joinTime02")

輸出結果為:

0.017965127833818366 joinTime011.984568595269575 joinTime02

其實耗時最長的是建立這個長度為百萬的列表………


刪除字串中的字元:
可以用於刪除字串中特定字元的方法有:
1. 字串的strip()、lstrip()、rstrip(),用於去掉字串兩端的字元。
2. 使用切片+拼接的方式,可以刪除單個固定位置的字元。
3. 字串的replace()函數或Regex的re.sub()函數可以刪除任意位置的字元。
4. 字串的translate()函數可以同時刪除多種不同的字元。
使用strip()、lstrip()、restrip()刪除兩端字元:

str01 = "  這是一段字串,前有2個空白字元,後有3個空白字串   "str02 = str01.strip()  # 預設刪除前後兩端所有的空白字元。str03 = str02.strip("空白字串")  # 也可以用來刪除前後位置指定的字串。str04 = str02.strip("空白")  # 但是指定字元如果沒有在首尾位置,則不會刪除。str05 = str02.strip("這是字串")  # 參數中的字元分別在首尾位置,但strip()仍能識別。print(str02, "\n", str03, "\n", str04, "\n", str05)str01 = "---test+++++"str02 = str01.strip("+-")  # 只要參數中的字元被前後包含,則都會刪除。print(str02)

輸出結果為:

這是一段字串,前有2個空白字元,後有3個空白字串  這是一段字串,前有2個空白字元,後有3個  這是一段字串,前有2個空白字元,後有3個空白字串  一段字串,前有2個空白字元,後有3個空白test

而剩下的lstrip()和rstrip()同strip()的作用相同,區別在於,strip()是會對首尾兩端合格字元進行刪除,而lstrip()和rstrip()僅會分別對左右一端的字元進行刪除。


使用切片和拼接的刪除字元:

str01 = "abc:123"str02 = str01[:3] + str01[4:]  # 使用切片略過希望刪除的部分。print(str02)

輸出結果為:

abc123


使用replace()函數或re.sub()函數替換字元:

from re import sub  # 僅匯入re包中的sub()函數str01 = "abc\tcbd\nxyz"str02 = str01.replace("\t", "-")  # 可以在字串中篩選目標字串和替換成的字串。# 但replace()在同一個函數中只能替換一次。上例中的\n則無法在同一個函數中剔除。print(str02)# 使用Regex中的sub()函數替換字串中的字元。# 首先定義篩選的規則(Regex),然後定義替換成何種類型的字元。# 最後將需要被篩選的字串作為參數傳遞給sub()函數。str03 = sub("[\t\n]", "-", str01)print(str03)

輸出結果為:

abc-cbdxyzabc-cbd-xyz


使用字串translate()函數剔除多個字元:
關於2.X和3.X兩個版本中的maketrans()和translate()兩個函數的區別簡單介紹下:
Python3.X中,對字串進行了重新劃分,分為了位元組字元(bytes)和文本字串(str),由於兩者都是不可變的,所以添加了一個可變的位元組字串類型(bytearray)。由於在2.X版本中,string類型和str、unicode中很多的函數都是重複的,所以在3.X版本中不提倡使用string類型。

"""maketrans()函數用於建立“字元對應表關係轉換表”,這個轉換表用於將源字元轉換成目標字元。maketrans()函數接收兩個參數:第一個參數是一段字串,表示需要轉換的字元,即源字元。第二個參數也是一段字串,表示需要轉換成何種字元,即目標字元。而兩個字串的長度必須相等,用於保證對應關係。"""inTab = "abcd"outTab = "1234"strSwitchTab = str.maketrans(inTab, outTab)  # bytes()等函數中也有該方法。# translate()函數將根據maketrans()函數返回的“字元對應表關係轉換表”,對使用該函數的字串進行轉換。textStr = "這a是B一c段D測b試"textStr = textStr.translate(strSwitchTab)print(textStr)"""而在Python3.0+的版本中,如果希望刪除任一字元,則需要在maketrans()函數的第三個參數中定義。如果不希望替換其他元素,則將前兩個參數定義為空白字串。而在第三個參數中定義需要刪除的字元。值得注意的是,在這種操作中,translate()函數不會區分你定義的需刪除字串是一個“單詞”還是“字母”。它會將你輸入的所有字元同字串中的所以字元進行相匹配,如果相同,則直接刪除。"""textStr = "這a是B一c段D測b試DacbB"strDelTab = str.maketrans("","","DacbB")textStr = textStr.translate(strDelTab)print(textStr)

輸出結果為:

這1是B一3段D測2試這是一段測試


字串類型:
Python3非常重要的新特性之一就是將文本和位元據做了非常清晰的區分,文本總是Unicode的,使用str表示。位元據則由bytes類型來表示。Python3 不會使用任何隱式的方式來混用str和bytes,例如,你無法將字串和位元組包拼裝到一起,也無法在位元組包中搜尋某個字串。
但字串是可以解碼為位元組包的,而位元組包也可以解碼為字串。

text = "一段中文字元"text = text.encode("UTF-8")  # 將str字串解碼成二進位位元組包print(text)text = text.decode("UTF-8")  # 再將二進位位元組包轉碼成str字串print(text)

輸出結果為:

b'\xe4\xb8\x80\xe6\xae\xb5\xe4\xb8\xad\xe6\x96\x87\xe5\xad\x97\xe7\xac\xa6'一段中文字元

編碼(上面的UTF-8)是這個轉換過程中至關重要的一部分,脫離了編碼,二進位位元組包就是一堆位元位而已,是編碼賦予其含義,因此採用不同的編碼,這堆位元位的含義也不盡相同。


字串前字母的含義:

"""在字串前添加u,表示對字串進行unicode編碼。一般英文字元在各種編碼下都可以正常解析,所以一般不帶u;但是中文字串,必須明確表明所需的編碼,否則轉碼時就會出現亂碼。值得注意的是,UTF-8是unicode的一種實現方式。"""str01 = u"這是一段字串"print(str01)"""在字串前添加r,表示非轉義的原始字串。在字串中,可能會有一些轉意符,長見的有“\n”,“\t”等,但如果該字串以r開頭,則說明在這個字串中所有的其他字元,都是一般字元。"""str02 = r"這是一段\n字串"print(str02)"""在字串前添加b,表示是bytes二進位編碼。"""byte = b"testCode"print(byte)print(type(byte))

輸出結果為:

這是一段字串這是一段\n字串b'testCode'<class 'bytes'>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.