Python字符串方法split()中的一道坑


初看這個方法還挺好用的,用來切割字符串真是的是非常方便,返回的字符串數組也非常容易處理。

於是乎看了一眼就應用到我的程序當中去了。

用來切割如下形式的字符串

s = 'Jul 24 21:38:25 luozw medusa.py[24707]: HOST=192.168.50.77 LOGIN=root PASSWORD=123456 SERVICE=ssh PORT=22'

 

month = s.split(' ')[0]  #取月份

day = s.split(' ')[1]      #取天數

……

成功的運行了。

后來設置到crontab中自動運行,也能成功運行,可是到了8月份的時候結果就不正常了。

自己跑到八月份的日志文件里看

Aug  1 21:38:25 luozw medusa.py[24707]: HOST=192.168.50.77 LOGIN=root PASSWORD=123456 SERVICE=ssh PORT=22

日志格式看起來也沒問題,然后不得已去調試源程序,發現切割的字符串亂七八糟的。

將s.split(' ')直接打印出來看,馬上就明白了:

['Aug', '', '2', '21:38:25', 'luozw', 'medusa.py[24707]:', 'HOST=192.168.50.77', 'LOGIN=root', 'PASSWORD=123456', 'SERVICE=ssh', 'PORT=22']

數組第二個元素是一個空字符串,它代表了一個空格,原來spilt方法是嚴格按照過濾參數設置的,不會感知連續過濾的參數。

Jul 24之間相距一個空格,但是Aug  1之間就相距兩個空格,所以切割失敗,導致后來取得數據發生錯誤。

此時有兩個解決辦法:

1.采用不帶參數的split(),它會把所有空格(空格符、制表符、換行符)當作分隔符。

2.filter(None, s.split(' '))

 

第二種方法應用場景更多一些。

看看這個例子

a = 'hello++world!+'

如何取得'hello'和'world'呢?

>>>a.split('+')

['hello', '', 'world!', '']    #含有兩個空字符串

>>>filter(None, a.split('+'))

['hello', 'world!']

關於filter()方法的使用說明:

filter(...)
filter(function or None, sequence) -> list, tuple, or string

Return those items of sequence for which function(item) is true. If
function is None, return the items that are true. If sequence is a tuple
or string, return the same type, else return a list.

 

 

總結的經驗:對函數方法的使用不要過於想當然了,文檔簡易可得的話最好把函數說明看完。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM