您的位置:首页 > 编程语言 > Python开发

Python 字符串

2015-10-17 14:42 411 查看
转载:http://liuzhichao.com/p/1630.html

字符串:单引号(‘)和双引号(”)的作用相同,转义符是(\),以三引号(如:”’或者”””)括起来的字符串中可以直接使用任意多个单引号(‘)和双引号(”)而无需转义符(\)。

自然字符串:在字符串前加R(或r)指示某些不需要如转义符那样的特别处理的字符串,如:print R“Hello\n World”,将直接输出“Hello\n World”而不会出现换行的情况。

Unicode字符串:在字符串前加U(或u)。
s1 = 's1'
s2 = "s2"
s3 = r'What\'s your name?'
s4 = ''' I'm Liuzc '''
s5 = u"This is a Unicode string."


字符串的基本操作

与Java类似,在Python中,字符串可以通过”+”操作符进行合并,比较特有的是Python中还可以通过”*”操作符进行重复.
print 'abc'+'def'     # abcdef
print 'abc'*3         # abcabcabc
print len('abcdef')   # 6


使用”*”操作符时,就像在字符串后再增加一定数量的自身.但是Python不允许将一个数字和一个字符串相加:’abc’+123会抛出一个错误,而不会得到’abc123′,正确的做法应该是’abc’+str(123).

内置的str函数将数字转换为字符串表达形式,而int函数则将字符串转换为数字.

内置的len函数返回一个字符串的长度.(这与获得列表,元组,集合或者字典的长度的函数是同一个)

索引和分片

在Python中,字符串是一个有序的字符的集合.这句话传递了两个信息, 1.字符串类似一个集合,2.它是有序的.

严格的说,Python的字符串被划分为不可变序列这一类别.这意味着一旦你创造了一个字符串,你就不能再改变它了.

我们说字符串是一个有序的字符集合,所以我们可以通过其索引位置获得它的元素.和Java语言一样,Python索引也是从0开始的,并比字符串的长度小1.但是与Java不同的是,在Python中,还支持负索引从序列中获取元素.负索引就是从字符串末尾处反向计算.
s = 'This is a string'
print s[3]   ###  下标从0开始,s[3]即 's'
print s[-1]  ###  -1表示最后一个字符 即 'g'


索引S[i]获取特定偏移的元素:

第一个元素的索引为0,S[0]获取第一个元素
负偏移索意味着从最后或右边反向进行计算,S[-2]获取了倒数第二个元素,就像S[len(S)-2]一样.

分片是用一对冒号”:”分隔的数字来索引字符串这样的序列对象,Python将返回一个新的对象,其中包含了以这对偏移所标识的连续的内容.左边的数字作为下边界(包含下边界在内),而右边的偏移作为上边界(不包含上边界在内).如果被省略,上、下边界的默认值对应分别为0和分片的对象的长度。

分片(S[i:j])提取对应的部分作为一个序列:

上边界并不包含在类,包含下边界,如果用数学中的集合表示,则为S[i:j)
分片的上边界默认为0,下边界默认为序列的长度.
S[1:3]获取从索引为1直到但不包括索引为3的元素
S[1:]获取从索引为1直到末尾之间的元素
S[:3]获取从开始直到但是不包括索引为3之间的元素
S[:-1]获取了从索引为0直到但是不包括最后一个元素之间的元素
S[:] 获取所以元素.有效地实现顶层S拷贝

S = 'abcdef'
print S[1:3]     #bc
print S[1:]      #bcdef
print S[:3]      #abc
print S[:-1]     #abcde
print S[:]       #abcdef


在Python2.3中,分片表达式增加了一个可选的第三个索引.用作步进.完整形式的分片现在变成了S[i:j:k],这表示:”索引S对象中的元素,从索引为i直到索引为j-1,每隔k个元素索引一次”,第三个限制k,默认为1.也可以使用负数作为步进.步进-1表示分片将会从右至左进行而不是通常的从左至右.因此,实际效果主是将序列反转.
S1 = '123456789'
print S1[1::2]   #2468
print S1[::-2]   #97531
print S1[5:1:-1] #6543


格式化字符串

Python 支持格式化字符串的输出.如今的Python中的字符串格式化可以以两种形式实现.

1.字符串格式化表达式

1)在%操作符的左侧放置一个需要进行格式化的字符串,这个字符串带有一个或多个嵌入的转换目标,都以%开头.(例如,%d,%s…)

2)在%操作符右侧放置一个(或多个,嵌入到元组中)对象,这些对象将会嵌入到左侧想让Python进行格式化字符串的一个(或多个)转换目标的位置上去.
'This is %d %s brid' % (1,'dead')   ## This is 1 dead brid

k = 'pwd'
v = 'admin'
'%s = %s' % (k,v)  ####  pwd = admin

print("%.2f%%" % 22.3)  ###  22.30%  如果在格式化字符串中要输出百分号,则需要使用 %%


转换说明符
转义说明符含义
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对象)
2.字符串格式化方法调用

s.format(*args,*kwargs)

该形式可认为是一种函数调用。
"{0},{2},{1}".format(one,2,3)
### 结果为"one,2,1",这个过程是使用{index}作为占位符,后面的args列表中相应下标的数据会替换之。

"{0},{2},{1},{str}".format(one,2,3,str="string")
###结果为 "one,2,1,string",由上面可以前3个依次被列表的索引所替换,而最后一个则被*kwargs字典所替换,这样就 不止局限于index了。

"{0:10},{1:>10.5f},{str:10}".format(one,2,3.2,str="string")
###结果为 "stirng , 1.30000,string "
#在原有的基础上加上冒号和标准形式中定义的格式转换符即可,但是这里要注意了,其对齐不在用“+”和“-”
#  而是 < 右对齐
#      > 左对齐
#      ^ 两边对齐


字符串方法

除表达式运算符之外,Python字符串还提供了一系统的方法去实现更复杂的字符串处理.这部分内容可以查看Python的标准手册以获取最新的列表,或者在交互模式下在任何字符串上调用help.
类型方法注解
填充center(width[, fillchar]) ,
ljust(width[, fillchar]),
rjust(width[, fillchar]),
zfill(width),
expandtabs([tabsize])
l fillchar 参数指定了用以填充的字符,默认为空格
l 顾名思义,zfill()即是以字符0进行填充,在输出数值时比较常用
l expandtabs()的tabsize 参数默认为8。它的功能是把字符串中的制表符(tab)转换为适当数量的空格。
删减strip([chars]),
lstrip([chars]),
rstrip([chars])
*strip()函数族用以去除字符串两端的空白符,空白符由string.whitespace常量定义。
变形lower(),
upper(),
capitalize(),
swapcase(),
title()
title()函数是比较特别的,它的功能是将每一个单词的首字母大写,并将单词中的非首字母转换为小写(英文文章的标题通常是这种格式)。
>>> ‘hello wORld!’.title()
‘Hello World!’
因为title() 函数并不去除字符串两端的空白符也不会把连续的空白符替换为一个空格,所以建议使用string 模块中的capwords(s)函数,它能够去除两端的空白符,再将连续的空白符用一个空格代替。
>>> ‘ hello world!’.title()
‘ Hello World!’
>>> string.capwords(‘ hello world!’)
‘Hello World!’

分切partition(sep),
rpartition(sep),
splitlines([keepends]),
split([sep [,maxsplit]]),
rsplit([sep[,maxsplit]])
l *partition()函数族是2.5版本新增的方法。它接受一个字符串参数,并返回一个3个元素的 tuple 对象。如果sep没出现在母串中,返回值是 (sep, ‘’, ‘’);否则,返回值的第一个元素是 sep 左端的部分,第二个元素是 sep 自身,第三个元素是
sep 右端的部分。
l 参数 maxsplit 是分切的次数,即最大的分切次数,所以返回值最多有 maxsplit+1 个元素。
l s.split() 和 s.split(‘ ‘)的返回值不尽相同
>>> ‘ hello world!’.split()
[‘hello’, ‘world!’]
>>> ‘ hello world!’.split(‘ ‘)
[”, ”, ‘hello’, ”, ”, ‘world!’]
产生差异的原因在于当忽略 sep 参数或sep参数为 None 时与明确给 sep 赋予字符串值时 split() 采用两种不同的算法。对于前者,split() 先去除字符串两端的空白符,然后以任意长度的空白符串作为界定符分切字符串(即连续的空白符串被当作单一的空白符看待);对于后者则认为两个连续的 sep 之间存在一个空字符串。因此对于空字符串(或空白符串),它们的返回值也是不同的:
>>> ”.split()
[]
>>> ”.split(‘ ‘)
[”]
连接join(seq)join() 函数的高效率(相对于循环相加而言),使它成为最值得关注的字符串方法之一。它的功用是将可迭代的字符串序列连接成一条长字符串,如:
>>> conf = {‘host’:’127.0.0.1′,
… ‘db’:’spam’,
… ‘user’:’sa’,
… ‘passwd’:’eggs’}
>>> ‘;’.join(“%s=%s”%(k, v) for k, v in conf.iteritems())
‘passswd=eggs;db=spam;user=sa;host=127.0.0.1’
判定isalnum(),
isalpha(),
isdigit(),
islower(),
isupper(),
isspace(),
istitle(),
startswith(prefix[, start[, end]]),
endswith(suffix[,start[, end]])
这些函数都比较简单,顾名知义。需要注意的是*with()函数族可以接受可选的 start, end 参数,善加利用,可以优化性能。
另,自 Py2.5 版本起,*with() 函数族的 prefix 参数可以接受 tuple 类型的实参,当实参中的某人元素能够匹配,即返回 True。
查找count( sub[, start[, end]]),
find( sub[, start[, end]]),
index( sub[, start[, end]]),
rfind( sub[, start[,end]]),
rindex( sub[, start[, end]])
find()函数族找不到时返回-1,index()函数族则抛出ValueError异常
另,也可以用 in 和 not in 操作符来判断字符串中是否存在某个模板。
替换replace(old, new[,count]),
translate(table[,deletechars])
l replace()函数的 count 参数用以指定最大替换次数
l translate() 的参数 table 可以由 string.maketrans(frm, to) 生成
l translate() 对 unicode 对象的支持并不完备,建议不要使用。
编码encode([encoding[,errors]]),
decode([encoding[,errors]])
这是一对互逆操作的方法,用以编码和解码字符串。因为str是平台相关的,它使用的内码依赖于操作系统环境,而unicode是平台无关的,是Python内部的字符串存储方式。unicode可以通过编码(encode)成为特定编码的str,而str也可以通过解码(decode)成为unicode。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: