字符串索引

Python索引从零开始,这与C++的数组一样

Python使用方括号来标识字符串索引:方括号内的数字指出了要获取哪个字符,如图6-1所示。在Python中,最小的字符串索引总是0,而最大的索引总幽默字符串长度小于1。

列表最小的三个索引 字符串最小的索引是_python

列表最小的三个索引 字符串最小的索引是_字符串_02

如果索引超出了字符串末尾,将导致“超出范围”错误:

列表最小的三个索引 字符串最小的索引是_字符串_03

负数索引

假设你要访问s的最后一个字符,而不是第一个字符。为此,可何用难看的表达式s[len(s) - 1],这当然可行,但相当复杂。所幸的是,在访问字符串末尾附近的字符方面,Python提供了一种更便利的方式:负数索引。其理念是,沿从右向左的方向,用负数表示字符串中字符的索引:

列表最小的三个索引 字符串最小的索引是_字符串_04

因此,字符串的最后一个字符为s[-1]。图6-2说明了负数索引的工作原理。

列表最小的三个索引 字符串最小的索引是_字符串_05


使用for循环访问字符

如果需要依次访问字符串的每个字符,for循环可助一臂之力。例如,下面的程序计算给定字符串的字符编码总和:


#codesum.py
def codesum1(s):
    """Returns the sums of the character codes of s.
    """
    total = 0
    for c in s:
        total = total + ord(c)
    return total


列表最小的三个索引 字符串最小的索引是_字符串_06

像这样使用for循环时,在循环的每次迭代开头,都会将循环变量c设置为s中的下一个字符。使用索引访问s中字符的工作由for循环自动处理


下面是另一种实现,它使用了常规字符串索引,将其与codesum1进行比较:


#codesum2.py
def codesum2(s):
    """Returns the sums of the
    character codes of s.
    """
    total = 0
    for i in range(len(s)):
        total = total + ord(s[i])
    return total


列表最小的三个索引 字符串最小的索引是_Python_07

这种实现的结果与codesum1相同,但更复杂、可读性更差


字符

字符串由字符组成,而字符本身实际上是一个非常复杂的问题。正如第2章指出的,所有字符都有对应的字符编码,你可以使用函数ord来获悉:

列表最小的三个索引 字符串最小的索引是_python_08


给定字符编码,可使用函数chr来获悉对应的字符

列表最小的三个索引 字符串最小的索引是_正则表达式_09

转义字符

并非所有字符都有可视的标准符号。例如,换行字符、回画字符和制表符都是不可见的,虽然它们带来的效果可见。这些字符属于空白字符——在印刷页面上显示为空白。

为处理空白字符以及其他不可打印的字符,Python使用一种特殊表示法——转义序列(也叫转义符)。表6-1列出了最常用的转义字符。

列表最小的三个索引 字符串最小的索引是_python_10

列表最小的三个索引 字符串最小的索引是_字符串_11

在Python中,表示换行的标准方式是使用字符\n

列表最小的三个索引 字符串最小的索引是_python_12


字符串切片

在Python中,可使用切片从字符串中提取子串。要对字符串执行切片操作,可指定两个索引:要提取的第一个字符的索引;要提取的最后一个字符的索引加我。例如:

列表最小的三个索引 字符串最小的索引是_python_13

用于切片的索引与用于访问各个字符的索引相同:第一个索引总是为零,而最后一个索引总是比字符串长度小1。一般而言,s[begin:end]返回从索引begin到end-1的子串。

请注意,如果s是一个字符串,则要访问索引i对应的字符,可使用s[i]或s[i:i+1]。


获取切片的捷径

如果你省略切片的起始索引,Python将假定它为零;如果你省略切片的终止索引,Python将假设你要提取到字符串末尾。例如:

列表最小的三个索引 字符串最小的索引是_列表最小的三个索引_14


下面是一个很有用的切片示例,这个函数返回文件名中的扩展名:


#extension.py
def get_ext(fname):
    """Returns the extension of file fname.
    """
    dot = fname.rfind('.')
    if dot == -1:  #fname中没有
        return ''
    else:
        return fname[dot + 1:]


列表最小的三个索引 字符串最小的索引是_正则表达式_15


函数get_ext()的工作原理如下:确定最右边的'.'的索引(因此使用rfind从右往左查找);如果fname不包含'.',则返回一个空字符串, 否则返回'.'后面的所有字符。

使用负数索引的切片

扫行切片操作时,也可使用负数索引,虽然这更难懂。例如:

列表最小的三个索引 字符串最小的索引是_字符串_16


标准字符串函数

Python字符串自带了大量很有用的函数,要查看所有这些函数,可调用dir并将参数指定为任何字符串(如dir(''))。虽然没有必要准确地记信所有这些函数的功能,但最好大致了解它们的功能,这样才能根据需要使用它们。因此,本节将分门别类地介绍字符串自带的所有函数。

6.4.1.测试函数

首先介绍检测字符串是否为特定格式的函数,它们组成了一个最大的字符串函数组。表6-2所示的测试函数都返回True或False。测试函数有时也叫布尔函数或谓启词。


列表最小的三个索引 字符串最小的索引是_Python_17

6.4.2搜索函数

如表6-3所示,在字符串中查找子串的方式有多种。函数index和find之间的差别在于没有找到rxjjpg子串时的情形。例如:

列表最小的三个索引 字符串最小的索引是_Python_18

列表最小的三个索引 字符串最小的索引是_列表最小的三个索引_19

函数index引发异常ValueError,第9章将更详细地介绍异常。

如果没有找到指定的子串,函数find将返回-1


字符串搜索函数通常从左往右(从开头往末尾)搜索,但以r打头的函数从右往左搜索。例如:

列表最小的三个索引 字符串最小的索引是_字符串_20

一般而言,函数find和index返回传入字符串第一次出现时的超始位置索引,而rfind和rindex返回传入字符串最后一次出现时的起始位置索引

6.4.3改变大小写的函数

Python提供了各种修改字母大小写的函数,如表6-4所示。别忘了,Python绝不会修改字符串:在所有这些函数中,Python都创建并返回一个新字符串。我们谈论字符串时,常常让人觉得字符串被修改。但这只是为了方便措词,并不意味着字符串真的被修改。

列表最小的三个索引 字符串最小的索引是_字符串_21


列表最小的三个索引 字符串最小的索引是_正则表达式_22

6.4.4设置格式的函数

表6-5列出了设置字符串格式的函数,它们让你能够美化字符串,以便向用户显示或打印到文件。

列表最小的三个索引 字符串最小的索引是_字符串_23


字符串函数format功能非常强大,包含用于设置字符串格式的微型语言。要使用函数format,你需要给它提供变量或值,如下例所示:

列表最小的三个索引 字符串最小的索引是_列表最小的三个索引_24

字符串中的{0}和{1}引用format的参数:它们将被替换为相应字符串或变量的值。你还可以使用关键字参数的名称:

列表最小的三个索引 字符串最小的索引是_列表最小的三个索引_25

这些示例演示了format的最基本用法,还有很多其他的选项,可用于指定字符串间距、将数据转换为字符串等。 

6.4.5剥除函数

剥除函数用于删除字符串开头或末尾多余的字符,如表6-6所示。

列表最小的三个索引 字符串最小的索引是_字符串_26

默认情况下,将剥除空白字符;如果指定了一个字符串参数,将剥除该字符串中的字符,如下所示:

列表最小的三个索引 字符串最小的索引是_python_27


6.4.6拆分函数 (这里用于分析爬虫网站应该很有用)

分拆函数将字符串拆分成多个子串,如表6-7所示。

列表最小的三个索引 字符串最小的索引是_Python_28

函数partition和rpartition将字符串拆分为3部分:

列表最小的三个索引 字符串最小的索引是_python_29

这两个函数总是返回一个这样的值:它由3个字符串组成,形式为(head, sep, tail)。这种返回值为元组,将在第7章更详细地介绍。

函数split以指定字符串为分隔符,将字符串划分为一系列子串,如下所示:

列表最小的三个索引 字符串最小的索引是_python_30

函数split总是返回一个字符串列表; Python列表总是分别以[和]打头和结尾,并用逗号分隔元素。正如你将在第7章看到的,列表和元组很像,主要差别在于列表是可以修改的,而元组是常量。


6.4.7替换函数

Python字符串自带了两个替换函数,如表6-8所示。

列表最小的三个索引 字符串最小的索引是_字符串_31

注意到使用替换函数可轻松地删除字符串中的子串:

列表最小的三个索引 字符串最小的索引是_字符串_32


6.4.8其他函数

最后,表6-9列出了其他字符串函数。

列表最小的三个索引 字符串最小的索引是_正则表达式_33

需要将一组字符转换为另一组字符时,函数translate和maketrans很实用。例如,下面是一种将字符串转换为“脑残体”(leetspeak)的方式:

列表最小的三个索引 字符串最小的索引是_python_34

函数zfill用于设置数值字符串的格式:

列表最小的三个索引 字符串最小的索引是_python_35

函数join很有用,它将一系列字符串拼接起来,其中包含分隔字符串,如下所示:

列表最小的三个索引 字符串最小的索引是_列表最小的三个索引_36

count和encode函数使用示例:

列表最小的三个索引 字符串最小的索引是_字符串_37

列表最小的三个索引 字符串最小的索引是_Python_38



正则表达式

虽然Python字符串提供了众多实用的函数,但实际处理字符串时,常常需要使用更强大的工具。

有鉴于此,程序员开发了一种用于复杂字符串处理的微型语言——正则表达式。

实际上,正则表达式就是一种简练措绘一组字符串的方式,可用于高效地执行常见的字符串处理任务,如匹配、分拆和替换。本节介绍正则表达式的基本概念以及一些常用的运算符(如表6-10所示)。

列表最小的三个索引 字符串最小的索引是_python_39


6.5.1简单的正则表达式

来看字符串'cat',它表示单个字符串,这个字符串由字母c,a和t组成。接下来看整个表达式'cat?',其中的?并非英语中的问号,而是一个正则表达式运算符,意思是它左边的那个字符是可选的。因此,正则表达式'cat?'描述了两个字符串:'cat'和'cats'。

另一个正则表达式运算符是|,其含义是“或者”。例如,正则表达式'a|b|c'描述了三个字符串:‘a’, 'b', 'c'。正则表达式'a*'描述了无穷个字符串:'', 'a','aa','aaa', 'aaaa'等。换句话说,‘a*’描述的是由零或更多个'a'组成的字符串。正则表达式'a+'与'a*'相同,但排除了空字符串''.

最后,在正则表达式中,可使用圆括号来指出要将运算符用于那个子串。例如,正则表达式'(ha)+'描述了如下字符串:'ha!','haha!','hahaha!'等;而'ha+!'描述了一组截然不同的字符串:'ha!', 'haa!', 'haaa!'等。

可随意混合使用这些(以及其他)正则表达式运算符。事实证明,这是一种非常实用的方式,可描述众多常见的字符串类型,如电话号码和电子邮件地址。

6.5.2使用正则表达式匹配字符串

匹配字条款串是正则表达式的一种常见用途。例如,假设你要编写一个程序,要求用户必须输入done 或quit来结束程序。为帮助识别这些字符串,可编写一个类似于下面的函数:

 

#allover.py
def is_done1(s):
    return s == 'done' or s == 'quit'
"""使用正则表达式时,行为完全与此相同的函数
可能类似于下面这样
"""
import re #使用正则表达式
def is_done2(s):
    return re.match('done•|quit', s) != None

列表最小的三个索引 字符串最小的索引是_python_40

再举一个更复杂的例子。假设要识别逗人的字符串:开头为一个或多个'ha',末尾为一个或多个'!'s

,如'haha!'、'ha!!!!!'和'hahaha!!'。使用正则表达式匹配这些字符串很容易:

 

#funny.py
import re
def is_funny(s):
    return re.match('(ha)+!+', s) != None

列表最小的三个索引 字符串最小的索引是_Python_41

6.5.3其他正则表达式

这里只涉及正则表达式的一些皮毛:Python库re规模庞大,其中有大量正则表达式函数可用于执行字符串处理任务,如匹配、分拆和替换;还有提高常用正则表达式处理速度的技巧。模块re的文档 (https://docs.python.org/3/library/re.html)提借了其他一些示例。