10 字符串常用函数

前述章节里已经介绍了一下字符串的基本概念,有序字母集合,用引号引起来,只读不可修改的集合类型。

引号引起来的字符串的引号有三种:单引号、双引号和三引号(三个单或三个双)。

print 'hello'
print "hello"
print '''hello'''
print """hello"""

一般三引号可以在Python源代码里用作多行注释或定义多行的字符串,另外Python可以用井号(#)进行单行注释。

a = 12
b = 13
"""
求和
"""
c = a + b

字符串是有序不可修改的序列,可以通过索引或者for循环体访问字符串里的各个元素值。

s = "python"
print s[1]
for c in s:
    printc

10.1 字符串函数的使用

Python为字符串提供了丰富的操作函数,其语法结构如下所示:

字符串.函数(参数列表)

在字符串和调用函数间用点号(.),看上去很奇怪,很想面向对象里对象调用方法的方式!对的,Python里的各种数据均是对象(类的对象),所以Python编程又可称面向对象的Python编程。在创建某数据实际都是在创建某类的对象,类为对象提供了大量方法,通过对象使用方法函数,这是面向对象编程本质,只不过很多Python书籍为了便于或降低初学者入门难度,在系统讲授Python的面向对象编程之前的内容一般不提每个数据类型的数据都是对象的问题而已,这里如果理解不了,等学了Python的类和对象一章以后再回来看看就明白了。

10.1.1 字符串函数

Python为字符串提供了很多的函数,可以在Python的官方帮助网站上查看到为字符串提供支持的有那些函数。

10.2 字符串函数示例

10.2.1 index函数

字符串的index函数可以查找字符串里(某范围内)某子串出现的位置(从左)。字符串的index函数的语法格式:

S.index(sub [,start [,end]]) -> int

函数的返回值为整形,即位置。sub为要查找的子串,start参数的含义是从S字符串的第start位置开始查找而不是从字符串的第一个字符位置开始查找,end参数的含义是到字符串S的end结束查找,end以后不查是否有sub子串。

如果没有指定start和end位置值,默认start就是0,end为字符串S尾部。

index示例

s = "hello python"
pi = s.index('p')
print pi,s[pi:]

程序执行结果:

6 python

再看一个例子,演示一下start和end的使用。

s = "hello Python! I like Python!"
print len(s), s
p1 = s.index('P')
p2 = s.index('P', p1 + 1)
print p1, s[p1:]
print p2, s[p2:]

程序的执行结果:

28 hello Python! I like Python!
6 Python! I like Python!
21 Python!

请注意,尽管指定了查找的起始位置但index函数的返回的位置值依然是该子串在整个字符串里的位置,而不是相对于start的位置。

10.2.2 replace函数

replace函数可以基于某字符串将其某子串替换成其他子串,返回值是一个新的字符串,意思是原字符串不变,而是新产生一个字符串。语法格式如下:

S.replace(old, new[, count]) -> string

old是要被替换的,new是要替换成的,而count参数的意思是从左至右替换几处。

replace示例

s = "python"
s1 = s.replace('p', 'P')
print s
print s1
s = "python "
s = s * 5
s2 = s.replace('p', 'J', 3)
print s2

程序的执行结果:

python
Python
Jython Jython Jython python python 

代码里的语句s2 = s.replace('p', 'J', 3)的作用是替换s字符串里前3次出现的子串"p"为"J"新产生s2字符串。

10.2.3 split函数

Python字符串的split函数可以依据规则将字符串分割成一个列表。函数的语法定义如下:

S.split([sep [,maxsplit]]) -> list of strings

sep是用什么符号可以去分割字符串S,而maxsplit的意思是可以分割出几个。如果sep没有指定,默认是所有的空字符,例如空格、回车、制表符等。maxsplit没指定的话,能分割出多少个就分割出多少个吧。

split示例1

s = "hello " * 5
print s
a = s.split()
print a

程序执行结果如下:

hello hello hello hello hello 
['hello', 'hello', 'hello', 'hello', 'hello']

语句a = s.split()对字符串'hello hello hello hello hello'进行分割,由于sep没有指定,那就用空格来分割这个字符串,s字符串里有4个空格,所以分割出来的结果a是一个长度为5的列表。

split示例2 这个例子说明一下split函数的seq参数含义

s = '''liao:python:c
qiao:java:d
xiao:swift:e
piao:go:r
tiao:c++:f
jiao:ruby:g
'''
a = s.split()
print a
print "*" * 10
for b in a:
    print b.split(":")

程序执行结果

['liao:python:c', 'qiao:java:d', 'xiao:swift:e', 'piao:go:r', 'tiao:c++:f', 'jiao:ruby:g']
**********
['liao', 'python', 'c']
['qiao', 'java', 'd']
['xiao', 'swift', 'e']
['piao', 'go', 'r']
['tiao', 'c++', 'f']
['jiao', 'ruby', 'g']

字符串s是一个多行的字符串,回车换行符号使得字符串展示出来是多行的结果,这个字符串很具有代表性,在很多的监控检测系统里采集的数据或者系统日志文件都是以这总形式保存数据的,一行代表一条,冒号表示该条数据的若干项数据,如何得到整个记录某字段的数据并进行数据分析是一个头疼的问题,可以用字符串的split将这些数据分割出来之后再进行处理。

a = s.split()是将s字符串用回车分割得到列表a,通过for循环体可以对a列表里的每项再分割,用":"分割,这样每条记录就又分割出各个字段的数据了。

10.2.4 strip函数

strip函数可以去掉字符串首尾的某些字符(不是字符串),又称剥离函数,语法格式如下所示:

S.strip([chars]) -> string

strip示例

s = "%!&pyt&%!hon&%!"
c = "!%&"
t = s.strip(c)
print t

程序执行结果如下:

pyt&%!hon

10.2.5 find函数

find函数和index函数很相似,但有区别,index找不到会报错中断程序执行,而find函数找不到sub子串的话不报错返回-1。find函数是从字符串左向右查找,rfind函数是从字符串右向左查找。

s = "I like python!"
p1 = s.find(" ")
p2 = s.rfind(" ")
print s
print s[p1 + 1: p2]

程序执行结果如下:

I like python!
like

10.2.6 maketrans和translate函数

这是一对儿函数,用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。

注:两个字符串的长度必须相同,为一一对应的关系。

示例

from string import maketrans
s1 = "012345"
s2 = "abcdef"
tt = maketrans(s1, s2)
print "0123456789".translate(tt)

程序执行结果:

abcdef6789