元旦快到了,大家想好怎麼過了嗎?新的一年有什麼打算呢?今天,跟大家一起做一個簡單的Python小案例:從一串亂碼中找出Happy New Year。提前,祝大家新年快樂!
前幾篇內容我們了解了拼接字符串的常用方法(參見真的了解字符串拼接嗎?用Python拼接字符串的常用方法及性能分析),並對幾種字符串拼接方法作了性能上的分析(參見字符串拼接方式哪種快?使用Python分析連接字符的常用方法及性能)。今天的內容當然是字符串的拆分咯!
廢話不多說,奔主題了
我們要拆分的字符串長這樣:
s = '!,H*,(a,).&%p,|#%-+=p?y*$N{[e[}}><w+^|Y/e$#@;a-r@'
需求是將其中的Happy New Year提取出來!
分析
簡單來講,今天的內容就是Python字符串的拆分。我們知道,Python中字符串使用split(s)方法可以以s為分隔符,將一個字符串進行拆分,使用split()方法應該也可以實現我們的需求。
還有一種方法就是使用re模塊中的split(s, ds)方法,按照所能匹配的字串模式ds將字符串s進行切分,返回切分後的字符串列表。
解決問題
我們先看下需要排除哪些字符串:ds ='!,*().%,|-+=?${[}><^/#@;^&'(非英文字符基本都有了)。
方法一:使用str.split()函數
我們先來以','進行拆分
>>>
['!', 'H*', '(a', ').&%p', '|#%-+=p?y*$N{[e[}}><w+^|Y/e$#@;a-r@']
分成了四個元素的列表。再來使用『?』進行拆分:
t = []
for item in s.split(','):
t.extend(item.split('.'))
>>>
['!', 'H*', '(a', ')', '&%p', '|#%-+=p?y*$N{[e[}}><w+^|Y/e$#@;a-r@']
……那麼,有沒有規律可循呢?
我們每次拆分都會得到一個列表,然後每次都會從新的列表裡面遍曆元素進行拆分,這樣的話,我們可以使用下面這種方式:
# 將需要拆分的字符串裝入一個列表中
r = [s]
# 循環遍歷每一個分隔符
for d in ds:
# 創建一個空列表,接受每次分割的結果
t = []
# 遍歷需要分割的列表r
for item in r:
# 將列表中元素分割後的結果擴展到空列表t中
t.extend(item.split(d))
# 此時,將t的內容賦值給列表r
r = t
# 最後返回結果,連接字符串
''.join([x for x in r if x != ''])
>>>HappyNewYear
拆分成功!
方法二:使用re.split()方法
相對來說比較簡單,我們使用之前定義的ds進行排除,代碼如下:
''.join([x for x in re.split(ds, s) if x != ''])
>>>
re.error: unterminated character set at position 27
看到結果了嗎?程序出錯了,原因是我們的字符串內又託字符"^",這個字符在re表達式中是取反的意思。這表示,如果我們使用上面定義的ds,是得不到結果的。那有沒有別的辦法呢?
我們換一種思路,這樣修改ds看下結果
ds = '[^a-zA-Z0-9]+' # 匹配非字母、數字的字符
''.join([x for x in re.split(ds, s) if x != ''])
>>>HappyNewYear
成功拆分!
re和str的拆分字符串的方法孰優孰劣?如果對正則表達式熟悉,那麼,拆分這個字符串就很簡單,如果不熟悉的話就循環遍歷吧!怎麼樣?從這簡單的案例可以看出正則表達式的重要性了嗎?可以幫我們省不少代碼呢?給喜歡或想研究正則表達式的小夥伴們推薦一本秘籍,傳說中的貓頭鷹書,可以全方位了解掌握正則表達式,喜歡的小夥伴趕緊入手吧:
好了,今天的內容就到這裡了,這項技能Get到了嗎?
祝大家新年快樂!小夥伴們別光顧著過元旦了,新的一年要定下學習目標哦!
還有沒有別的字符串拆分的方法呢?歡迎大家留言討論。喜歡Python的小夥伴們關注我,大家一起學習提高……
轉載請註明出處,百家號:Python高手養成