Fork me on GitHub
Python中数据结构之字符串:每种语言必重点讲授的难点内容

字符串是不可变的序列,序列的标准操作(索引、分片、乘法、判断成员资格、求长度、取最大值和最小值)依然适合与字符串。

1、格式化字符串,字符串格式化操作符”%”:

>>>format = “Hello , %s. %s enough for ya”

>>>values = (‘world’,'Hot’)

>>>print format % values

Hello, world. Hot enough for ya?

“%s”被称为转换说明符,标记了需要插入转换值的位置,’s'表示值会被格式化为字符串(若原有值不是字符串会调用str将其转换为字符串),这个方法适合于大多数的值,如果要在格式化字符串中包含百分号则最好写成”%%”形式,例如:”%%s”。

格式化操作符右操作数可以为任意内容,但如果是元组或映射类型(如:字典),则字符串格式化方式略有不同。如果格式化操作数为元组,则元组中的每个元素都会被单独格式化,每一个值都需要一个对应的转换符(如上例)。一般的如下:

>>> print ‘%s good afternoon!’ % ['lily']  

['lily'] good afternoon!

基本的转换说明符包括以下几个部分,这些项的顺序必须规范:

(1)”%”字符,标记转换说明符的开始。

(2)转换标记(可选):”-”表示左对齐,”+”表示在转换数值前加上相应的正负号,” “空白表示正数前保留空格,”0″表示转换值若位数不够则用0填充。

(3)最小字段宽度(可选):转换后的字符串至少应该具有该值指定的宽度,如果用’*'标志则宽度值会从元组中读取。

(4)点”.”后跟精度值(可选):如果转换的是实数,精度值就表示出现在小数点后的位数,如果转换的是字符串,则该数字表示最大字段宽度,如果用”*”代替,则精度值将从元组中读取。

(5) 转换类型,即例如’%%s’中的’s':

d,i:带符号的十进制整数

o:不带符号的八进制

u:不带符号的十进制

x:不带符号的十六进制(小写),X:表示大写

e:科学计数法表示的浮点数(小写),E:表示大写

f,F:十进制浮点数

g:如果指数大于-4或小于精度值则同e,其他同f

G:如果指数大于-4或小于精度值则同E,其他同F

C:单个字符,接受整数或者单字符的字符串

r:字符串(使用repr转换任意Python对象)

s: 字符串(使用str转换任意Python对象)

举例:

>>> from math import pi

>>>’%010.2f’ % pi#表示字段宽度为10,使用0进行空位填充,精度为2的十进制浮点数

’0000003.14′

>>>print (‘%5d’ % 10) +’\n’ + (‘%5d’ % -10)#5表示字符宽度为5,右对齐的十进制整数

10

-10

>>>print (‘%+5d’ % 10) +’\n’ + (‘%+5d’ % -10)

+10

-10

>>>’using str: %s’ % 42L

‘using str: 42′

>>>’using repr: %r’ % 42L

‘using repr: 42L’

>>>’%.*s’ % (5,’Guido Van Rossum’)

‘Guido’

 

2、另一种字符串格式方法——模板字符串,工作方式类似于Unix shell中的变量替换,如下substitute模板方法用传递进来的关键字参数替换字符串中$打头的变量:

>>>from string import Template

>>>s = Template(‘$x, glorious $x!’)

>>>s.substitute(x=’good’)

‘good, glorious good!’

#如果替换字段是单词的一部分内容,则参数名必须用括号括起来,从而正确指明结尾:

>>>s = Template(“It’s ${}tastic!”)

>>>s.substitute(x=’fan’)

“it’s fantastic!”

#要插入美元符号则需要使用$$:

>>>s = Tempalate(“Make $$ selling $x!”)

>>>s.substitute(x = ‘goose’)

‘Make $ selling goose!’

#使用字典变量提供值或名称对:

>>>s = Template(‘A $thing must never $action. ‘)

>>>d={‘thing’:'gentleman’,'action’:'show his socks’}

>>>s.substitute(d)

‘A gentleman must never show his socks. ‘

3、常用的字符串方法介绍

先介绍string中常见的字符串常量:

string.digits:包含数字0~9的字符串

string.letters:包含所有字母(大写小写)的字符串

string.lowercase:包含所有小写字母的字符串

string.printable:包含所有可打印字符的字符串

string.punctunation:包含所有标点的字符串

string.uppercase:包含所有大写字母的字符串

#注:Python3.0后string.letters和其他相关内容已被移除,都只能使用string.ascii_letters这种类型常量替代。

1. find方法在字符串中查找字符串并返回子串所在位置的最左端索引,若未找到则返回-1

>>>’With a moo-moo here,and a moo-moo there’.find(‘moo’)

7

>>>”a b c d a d e !”.find(‘f’)

-1

>>>”a b c d a d e”.find(‘a’,1,9)#find同时支持提供搜索的起点(1)和终点(9)

8

#其他部分的常见可支持起点和终点的方法:rfind,index,rindex,count,startwith,endwith

2. join方法,是split方法的逆方法,在队列中添加元素:

>>>seq = [1,2,3,4,5]

sep = ‘+’

sep.join(seq)#连接数字列表,结果出错

>>>seq = ['1','2','3','4','5']

>>>sep.join(seq)#连接字符串列表

’1+2+3+4+5′

>>>dir = ‘ ‘, ‘usr’, ‘bin’, ‘env’

>>>’/’.join(dirs)#连接字符串元组

‘ /usr/bin/env’

>>>print ‘C: ‘ + ‘\\’.join(dirs)

C: \usr\bin\env

#被插入的目标队列元素都必须是字符串

3. lower方法返回字符串的小写字母版:

>>>’A and B’.lower()

‘a and b’

>>>names = ['liu','zhang','li']

>>>if raw_input(“Enter your name: “).lower() in names: print ‘Found it!’

Enter your name: Liu

Found it!

#类似或相关方法:islower、capitalize、swapcase(切换字符串大小写)、title、istitle、upper、isupper。

标题转换方法title:

>>>’that\’s all folks’.title()

‘That’S All Folks’

string模块的capwords函数:

>>>import string

>>>string.capwords(‘that\’s all folks’)

‘That’s All Folks’

4. replace方法,返回字符串的所有匹配项被替换后得到的字符串:

>>>’This is a test’.replace(‘is’,'eez’)#查找并替换

>>>’Theez eez a test’

5. split方法,join的逆方法,用于将字符串分割成列表。

>>>’1+2+3+4+5′.split(‘+’)#分隔符为’+’

['1','2','3','4','5']

#注:如果不提供分隔符,程序默认将空格作为分隔符(空格,制表符和换行等)

类似方法:rsplit、splitlines。

6. strip方法返回去除两侧(不包括字符串内部)空格的字符串:

>>>’    good luck!      ’.strip()

‘good luck!’

#和lower共用可比对输入和存储的值。

>>>names = ['liu','zhang','li']

>>>if (raw_input(“Enter your name: “).lower()).strip() in names: print ‘Found it!’

Enter your name:          Liu

Found it!

#还可以指定需去除的字符,只需将这些字符列为参数:

>>>’****Spam * for * everyone!!! ***’.strip(‘ *!’)

‘Spam * for * everyone’

类似方法:lstrip、rstrip。

7. translate方法,类似于replace方法,替换字符串的某些部分内容,但该方法只处理单个字符,优势在于可同时进行多个字符替换,部分情况下效率较replace高的多。可用于替换换行符或者其他和平台相关的特殊字符等,这里使用将纯正英文文本替换为德国口音为例,需要把字符c和s替换为k和z。

s使用translate前要先完成一张转换表,转换表中描述了以某字符替换某字符的对于关系,由于该表(实际为字符串)有多达256个项目,为了简便,我们使用string模板里面的maketrans函数操作。maketrans函数接受两个参数,两个等长的字符串,表示第一个字符串中的每个字符都用第二个字符串中相同位置的字符替换:

>>>from string import maketrans

>>>table = maketrans(‘cs’,'kz’)#转换表中256项目都有

>>>len(table)

256

>>>table[97:123]#26个小写英文字母的ascii位置

‘abkdefghijklmnopqrztuvwxyz’#替换后的结果

>>>maketrans(”,”)[97:123]#显示原始内容

 

‘abcdefghijklmnopqrstuvwxyz’

 

#表创建完后可用做translate方法的参数进行字符串的转换:

>>>’this is a incredible test’.translate(table)

‘thiz iz a inkredible tezt’

#translate方法的第二个参数为可选项,用于指定需要删除的字符,例如想要模拟一句语速超快的德国语,可以删除所有空格:

>>>’this is a incredible test’.translate(table)

‘thizizainkredibletezt’

#对于非英语字符串的问题,可能并不能使用lower转换,比如挪威大写转换成小写,此时需要使用translate转换,有时使用Unicode可能也能解决问题。

http://www.tebik.com/?p=209

 
分类: Python
posted on 2012-09-20 20:24  HackerVirus  阅读(241)  评论(0编辑  收藏  举报