• python字符串方法split的一道坑


    转自http://www.cnblogs.com/librasz/p/3232611.html

    初看这个方法还挺好用的,用来切割字符串真是的是非常方便,返回的字符串数组也非常容易处理。

    于是乎看了一眼就应用到我的程序当中去了。

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

    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.

    总结的经验:对函数方法的使用不要过于想当然了,文档简易可得的话最好把函数说明看完。

  • 相关阅读:
    go语言入门(3)运算符及流程控制
    go语言入门(2)数据类型
    go语言入门(1)
    ubuntu上软件下载慢,github下载慢
    密码基础知识(2)以RSA为例说明加密、解密、签名、验签
    让你减少焦虑的一首英文小诗
    使用脚本启动fabric时出错
    Hyperledger Fabric(5)ChainCode的编写步骤
    Hyperledger Fabric(4)链码ChainCode
    设计题专题总结
  • 原文地址:https://www.cnblogs.com/myyan/p/4837335.html
Copyright © 2020-2023  润新知