字符串是字符的序列

使用方括号运算符逐一访问每个字符。方括号里的表达式称为索引。

>>> fruit = 'banana'
    >>> letter = fruit[1]

在Python中, 索引是从字符串头部算起的一个偏移量, 第一个字母的
偏移量为0。

另一种方法是使用负索引, 从字符串结尾倒过来计算。 表达式fruit[-1]表示最后一个字母, fruit[-2]是倒数第二个字母。

通过循环遍历字符串

遍历的一种写法是使用while循环:

index = 0
    while index < len(fruit):
        letter = fruit[index]
        print letter
        index = index + 1

遍历的另一种写法是用for循环:

for char in fruit:
        print char

字符串分割

字符串的一个片段称为切片

>>> s = 'Monty Python'
    >>> print s[0:5]
    Monty
    >>> print s[6:12]
    Python

运算符[n:m] 返回字符串从第n到第m之间的字符, 包括第一个字符, 但不包括最后一个字符。

如果忽略第一个索引值(冒号之前), 切片就从字符串第一个字符开始计算。 如果忽略第二个索引值, 切片就计算到最后一个

>>> fruit = 'banana'
    >>> fruit[:3]
    'ban'
    >>> fruit[3:]
    'ana'

如果第一个索引值大于第二个索引值导致空字符串, 只会输出两个引号:

>>> fruit = 'banana'
    >>> fruit[3:3]
    "

fruit是一个字符串, 那么fruit[:]表示:

>>> fruit=""
    >>> fruit[:]
    ''
    >>> fruit="ewsr"
    >>> fruit[:]
    'ewsr'

字符串是不可变的

在赋值语句的左边使用[]运算符, 尝试改变字符串中的字符。 举例如下:

>>> greeting = 'Hello, world!'
    >>> greeting[0] = 'J'
    TypeError: object does not support item assignment

不能改变已经存在的字符串。 最好的办法是在原字符串基础上新建一个字符串

>>> greeting = 'Hello, world!'
    >>> new_greeting = 'J' + greeting[1:]
    >>> print new_greeting
    Jello, world!

这个例子将新的首字母与greeting的切片连接在一起。 这不会对原先的字符串造成影响。

循环与统计

下面的程序统计了字母a在字符串中出现的次数:

word = 'banana'
    count = 0
    for letter in word:
        if letter == 'a':
            count = count + 1
    print count

in运算符

单词in是一个布尔运算符, 对两个字符串进行比较, 如果第一个字符串是第二个字符串的子串, 则返回True。

>>> 'a' in 'banana'
    True
    >>> 'seed' in 'banana'
    False

字符串比较

所有的大写字母都在小写字母之前

字符串方法

字符串是一种Python对象。 一个对象包括数据( 即字符串本身) 和方法。 这些方法是内置在对象中的有效函数, 可以作用于对象的任一实例。

Python有一个dir函数, 它可以列出对象所有可用的方法

当dir函数列出这些方法, 你就可以用help获取关于这些方法的文档。 有关字符串方法比较全面的文档详见
http://docs.python.org/library/string.html

Python说明文档

调用方法与调用函数类似, 但语法不同。 调用方法的语法是, 使用句点作为分隔, 在变量名后面跟上方法名。

例如, upper方法接收一个字符串, 返回一个全部是大写字母的新字符串:

这次不使用upper(word)函数, 换做word.upper()方法。

>>> word = 'banana'        
    >>> new_word = word.upper()
    >>> print new_word
    BANANA

字符串方法find, 找到字符串中字符的所在位置:

>>> word = 'banana'
    >>> index = word.find('a')
    >>> print index
    1

find方法不仅适用字符, 还可以用于寻找子串:

>>> word.find('na')
    2

find方法还可以设置第二个参数, 从哪个索引位置开始查找:

>>> word.find('na', 3)
    4

利用strip方法移除字符串首尾的空白( 包括空格、 制表符和换行符) 。

>>> line = ' Here we go '
    >>> line.strip()
    'Here we go'

startswith方法:返回布尔值。

>>> line = 'Please have a nice day'
    >>> line.startswith('Please')
    True
    >>> line.startswith('p')

startswith方法对大小写敏感, 在检查之前, 使用lower方法将其全部转换为小写字母。

>>> line = 'Please have a nice day'
    >>> line.startswith('p')
    False
    >>> line.lower()
    'please have a nice day'
    >>> line.lower().startswith('p')
    True

字符串解析

我们想要在一个字符串中寻找它的子串。 如下是一行结构化的字符串:

From stephen.marquard@ uct.ac.za Sat Jan 5 09:14:16 2008

我们只想抽出电子邮件的第二部分( 即uct.ac.za) , 可以通过find方法和字符串切片来实现。

首先, 在字符串中找到@符号的位置。 其次, 找到@符号之后第一个空格所在的位置。 最后, 再用字符串切片来提取字符串中我们需要的部分。

>>> data = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
    >>> atpos = data.find('@')
    >>> print atpos
    21
    >>> sppos = data.find(' ',atpos)
    >>> print sppos
    31
    >>> host = data[atpos+1:sppos]
    >>> print host
    uct.ac.za
    >>>

这里使用的是find方法的一种用法, 让我们能指定find方法从何处开始寻找。

格式操作符%

与C语言中的prinf(“%d”,n)使用方法类似。

格式操作符%可以构建字符串, 使用变量中存储的数据来替代字符串的一部分。 对整数而言, %是模运算符。 如果第一个操作对象是字符串, 那么%就是格式操作符。

第一个操作对象是格式字符串, 它包含一个或多个格式化序列, 用来指定第二个操作对象的格式。 最终处理结果是字符串。

>>> camels = 42
    >>> 'I have spotted %d camels.' % camels
    'I have spotted 42 camels.'

如果字符串中存在多个格式序列, 那么第二个参数必须是元组。

‘%d’格式化整数, ‘%g’格式化浮点数( 不要问为什么) , ‘%s’格式化字符串:

>>> 'In %d years I have spotted %g %s.' % (3, 0.1, 'camels')

调试

针对空字符串出错问题:

输入空行之前代码运行正常。 由于没有第0位字符, 我们得到了异常信息反馈。 两种方法可以解决这个问题, 即使这一行为空, 仍然能保证“安全”运行。

一种方法是使用startswith方法, 如果字符串为空就返回False。

另一种方法是使用守护模式, 通过一条if语句进行控制, 保证第二个逻辑表达式只有在字符串中至少有一个字符时进行判断。

if len(line) > 0 and line[0] == '#' :