《Python基础教程》第3章 字符串操作

字符串也是元组的一种,本章会介绍:字符串的格式化、分割、联接、搜索。

基本字符串操作

所有标准的序列操作对字符串同样适用,唯一要记得的是字符串是不可变的,如下的操作是不合法的:

website = 'http://python.org'
website[-3:] = 'com' //TypeError

字符串格式化:精简版

>>> format = "hello, %s"
>>> values  =('world')
>>> format % values
'hello, world'

>>> format = "Pi with three decimals: %.3f"
>>>from math import pi
>>>print format % pi
Pi with three decimals: 3.142

字符串是很多编程语言中都会频繁被使用到的,该部分只是简单介绍字符串的格式化,在下一节会有详细的说明。

如上,%为字符串格式化操作符,操作符的左边是希望格式化的字符串,右边是格式化的值。上例中用于格式化的值是一个元组,用其他的会有什么样的结果属于下一章的讨论范畴。

%s是期望接受字符串,%.3f期望接受小数点后有三位的浮点数。

字符串格式化:完整版

格式化操作符%右边可以是任何东西,当右边是元组和字典(尚未介绍)的时候结果会有不同。本章只介绍右边是元组的情况。右操作数是元组的时候,每个元素都会被单独格式化,每个元组中的值都要对应一个做操作数中的字符转换说明符。

转换说明符包含以下部分:
(1)%:转换说明符的开始
(2)转换标识(可选): -/+/' '/0
(3)最小字段宽度
(4)(.):后跟精度值
(5)转换类型:......

简单转换

如下是几个练习,可以尝试下,在下方有答案:

练习1 'Price of eggs: $42'
练习2 'Hexidecimal price of eggs: 2a'
练习3 'Pi: 3.141593......'
练习4 'Very inexact estimate of Pi: 3'
练习5 'Using str:42'
练习5 'Using repr:42L'

答案1
>>> 'Price of eggs: $%d' % 42
答案2
>>> 'Price of eggs: %x' % 42
答案3
>>> from math import pi
>>> 'Pi: %f......' % pi
答案4
>>> from math import pi
>>> 'Very inexact estimate of Pi: %i' % pi
答案5
>>> 'Using str: %s' % 42L
答案6
>>> 'Using repr: %s' % repr(42L) 或 'Using repr: %r' % 42L

字段宽度和精度
>>> '%10.2f'%pi
'      3.14' #字段宽为10,精度为2
>>> '%10f'%pi
'  3.141593' #字段宽为10
>>> '%.*s' % (5,'Gui Vanchi')
'Gui V' #使用*会从右操作数中去读取参数
符号、对齐和0填充
>>> '%010.2f'%pi
'0000003.14' #在字符宽度前加0会将结果前面的空格用0填充
>>> '%-10.2f'%pi
'3.14    ' #加-号会使结果左对齐
>>> print('% 5d' % 10) + '\n' + ('% 5d' % -10)
   10
  -10 # 加‘ ’可以方便同样的缩进
>>> print('%+5d' % 10) + '\n' + ('%+5d' % -10)
  +10
  -10 #加+可以保证结果中包含正负有同样的缩进

围绕上述所提到的这些知识点,该书书写了一个例子,要求的输出结果如下所示。可以自己写代码试试看,参考答案在下面:

Screen Shot 2015-01-07 at 1.58.39 PM.png

如下为个人的版本:

width = int(raw_input('Please enter with:'))
print '=' * width
print 'Item' + '% *s' % (width - len('Item'), 'Price')
print '-' * width
print 'Apples' + '% *s' % (width - len('Prices'), '0.40')
print 'Pears' + '% *s' % (width - len('Pears'), '0.50')
print 'Cantaloupes' + '% *s' % (width - len('Cantaloupes'), '1.92')
print 'Dried Apricots (16 oz. )' + '% *s' % (width - len('Dried Apricots (16 oz. )'), '8.00')
print 'Prunes (4 lbs. )' + '% *s' % (width - len('Prunes (4 lbs. )'), '12.00')
print '=' * width

如下为该书给出的示例版本(生在做了抽象和使用了“-”来左对齐):

width = int(raw_input('Please enter with:'))
price_width  = 10
item_width = width - price_width
head_format = '%-*s%*s'
list_format = '%-*s%*.2f'
print '=' * width
print head_format % (item_width, 'Item', price_width, 'Price')
print '-' * width
print list_format % (item_width, 'Apples', price_width, 0.4)
print list_format % (item_width, 'Pears', price_width, 0.5)
print list_format % (item_width, 'Cantaloupes', price_width, 1.92)
print list_format % (item_width, 'Dried Apricots (16 oz. )', price_width, 8.00)
print list_format % (item_width, 'Prunes (4 lbs. )', price_width, 12)
print '=' * width

字符串方法

字符串方法有很多,在该书的附录B中又详细描述,如下只列举最常用的方法:

  • find()
    find方法提供了在字符串中查找子字符串的功能,找到了返回子字符串左端索引,否则返回-1。还可以指定查找范围:通过指定开始索引位置和终止索引位置。

    >>> sentence = 'Klay Thompson is as smart of a defender as it gets.'
    >>> sentence.find('Thompson')
    5
    >>> sentence.find('Lebron')
    -1
    >>> sentence.find('Thompson', 8)
    -1
    
  • join()

join方法是split方法的逆方法,join的列表中必须都是字符串。

>>> seq = [1,2,3,4,5]
>>> ','.join(seq) //TypeError

>>> seq = ['1','2','3','4', '5']
>>> ','.join(seq)
'1,2,3,4,5'

>>> dirs = '', 'usr', 'bin', 'env'
>>> '/'.join(dirs)
'/usr/bin/env'

>>> print 'C:'  + '\\'.join(dirs)
C:\usr\bin\env
  • lower()

    >>> 'The defensive philosophies of Klay Thompson'.lower()
    'the defensive philosophies of klay thompson'
    
  • replace()

>>> 'This is an egg'.replace('is', 'ezz')
'Thezz ezz an egg' #替换所有匹配项
  • split()

    >>> '1,2,3,4,5'.split(',')
    ['1', '2', '3', '4', '5']
    
    >>> '/usr/bin/env'.split('/')
    ['', 'usr', 'bin', 'env']
    
    >>> 'Using the default'.split()
    ['Using', 'the', 'default']
    
  • strip()

    >>> ' Thompson read it easily. '.strip()
    'Thompson read it easily.'
    
  • translate()

>>> from string import maketrans
>>> table = maketrans('cs', 'kz')
>>> 'This is an incredible test'.translate(table)
'Thiz iz an inkredible tezt'
>>> 'This is an incredible test'.translate(table,' ')
'Thizizaninkredibletezt'

maketrans指定了要替换的字符匹配关系,将得到的table作为参数传递给translate就可以进行“多”字符的替换了。其中第二个参数可以指定要删除的字符串。


推荐阅读更多精彩内容