Python 字符串处理

1. 前言

python由于早期专门编写了一个string模块,后面又整合到字符串对象中。所以python字符串处理有两种:一种是直接处理,一种是导入string模块处理。为了向后兼容,python一直保留着string模块。

2. numpy中的字符串(写在最前面)

numpy中有numpy.chararray

class numpy.chararray
    Provides a convenient view on arrays of string and unicode values.

    The chararray class exists for backwards compatibility with Numarray, it is not recommended for new development. Starting from numpy 1.4, if one needs arrays of strings, it is recommended to use arrays of dtype object_, string_ or unicode_, and use the free functions in the numpy.char module for fast vectorized string operations.
    即这个class之所以还存在是为了向下兼容,从numpy.__verison__ = 1.4起,推荐用numpy.char模块中的函数。比如创建一个字符数组应该用np.char.array而不是np.chararray

    Parameters:    
        shape : tuple
        Shape of the array.

        itemsize : int, optional
        Length of each array element, in number of characters. Default is 1.

        unicode : bool, optional
        Are the array elements of type unicode (True) or string (False). Default is False.

举个栗子
>>> a= np.chararray((3,3), itemsize=3, unicode=True) 
>>> a
chararray([['', '', ''],
       ['', '', ''],
       ['', '', '']], 
      dtype='<U3')
>>> a[:] = 'AAA'
>>> a
chararray([['AAA', 'AAA', 'AAA'],
       ['AAA', 'AAA', 'AAA'],
       ['AAA', 'AAA', 'AAA']], 
      dtype='<U3')
>>> a[0,0]
'AAA'
>>> type(a[0,0])
str
Note: numpy的字符串数组还有很多methods可以用,操作方便。

3. 字符串的截取

这个字符串截取在python相当方便,因为python有切片器这个神奇的东西,而且字符串实际是一个字符数组。注意切片器是从0开始的,需要两个参数指定起始位置(类似于C#或Java的substring方法),其中len函数是获取字符串的长度。

>>> str[:3] # 左截取3个字符:

>>> str[len(str)-3:] #右截取3个字符 note: 不用写[-100:0],右边的0不需要

>>> str[1:4] # 从中间第2个字符开始截取3个字符

4. 字符串的格式化

这个字符串格式化也是相当重要的一个功能。python中用%s和元组来搭配使用。例如:

  >>> "hello,I am %s, from %s" % ('Tom','America')` # output: hello, I am Tom, from America

python 官方推荐用format格式,最近又推出了另外一种更加方便的格式。

5. 字符串的填充

“字符串填充是把不足位数的用指定字符填充进去”
分别有center,ljust, rjust, zfill方法

>>> "abc".center(5,'-') #用-填充,中间填充

'-abc-'

>>> "abc".ljust(5,'-') #用-填充,左边填充

'abc--'

>>> "abc".rjust(5,'-') #用-填充,右边填充

'--abc'

>>> "abc".zfill(5)   #0值填充,右边填充

'00abc'

Note: 这个可以用于xml文件名字的timestep填充

6. 字母大小写转换

str.lower()    #把字母转成小写
str.upper()    #把字母转成大写
str.swapcase()  #大小写互换
str.capitalize() #句子首字母大写
str.title()    #每个单词首字母大写

最后这个titile方法,string模块也有一个方法对应 string.capwords(str)

7. 字符串判断

1、str.isalpha() #是否全是字母,并至少有一个字符

2、str.isdigit() #是否全是数字,并至少有一个字符 

3、str.isspace() #是否全是空白字符,并至少有一个字符 

4、str.islower() #字母是否全是小写 

5、str.isupper() #字母是否便是大写 

6、str.istitle() #是否是首字母大写的 

7、str.startwith(prefix[,start[,end]]) #是否以prefix开头 

8、str.endwith(suffix[,start[,end]])  #以suffix结尾

8. string模块常量

1. string.digits    #数字0~9

2. string.letters    #所有字母(大小写)

3. string.lowercase   #所有小写字母

4. string.printable   #可打印字符的字符串

5. string.punctuation   #所有标点

6. string.uppercase   #所有大写字母

9. 字符串查找

“只是判断是否包含某些字符串还不够,有时候还需要知道具体位置。”

1、str.find(substr, [start, [end]])

返回str中出现substr的第一个字母的标号,如果str中没有substr则返回-1。start和end作用就相当于在str[start:end]中搜索。

2、str.rfind(substr, [start, [end]])

返回str中最后出现的substr的第一个字母的标号,如果str中没有substr则返回-1,也就是说从右边算起的第一次出现的。

3、str.index(substr, [start, [end]]) 

与find()相同,只是在str中没有substr时,会返回一个运行时错误  

4、str.rindex(substr, [start, [end]]) 

与rfind()相同,只是在str中没有substr时,会返回一个运行时错误

5、str.count(substr, [start, [end]]) #计算substr在str中出现的次数

10. 字符串的替换

1、str.replace(oldstr, newstr, [count]) 

把str中的oldstar替换为newstr,count为替换次数。

2、str.strip([chars]) 

把str中左右两边包含chars中有的字符全部去掉,可以理解为把str左右两边出现的chars替换为None 

3、str.lstrip([chars])

把str中左边包含chars中有的字符全部去掉,可以理解为把str左边出现的chars替换为None 

4、str.rstrip([chars]) 

把str中右边包含chars中有的字符全部去掉,可以理解为把str右边出现的chars替换为None 

5、str.expandtabs([tabsize]) 

把str中的tab字符替换没空格,每个tab替换为tabsize个空格,默认是8

11. 字符串的分割和组合

1、str.split([sep, [maxsplit]]) 

以sep为分隔符,把S分成一个list。maxsplit表示分割的次数。默认的分割符为空白字符。例如:

>>> '123-34-45436'.split('-')

['123', '34', '45436'] 

2、str.rsplit([sep, [maxsplit]])

这个和str.splitlines([keepends]) 效果一样,都是把str按照行分割符分为一个list,keepends是一个bool值,如果为真每行后而会保留行分割符。例如:

>>> '123\r234\n345'.rsplit()

['123', '234', '345']

3、str.join(seq) 

把seq代表的序列──字符串序列,用str连接起来。例如:

>>> ''.join(['df', '234', 'd4'])

'df234d4'

>>> '-'.join(['df', '234', 'd4'])

'df-234-d4'

12. 字符串转数字

string模块还包含相关字符串转数字的方法。如下

>>> string.atoi("123",10)  #转成十进制

123

>>> string.atoi("A",16)   #转成十六进制

10

>>> string.atof("123")    #转成浮点型数字

123.0