Python str字符串精讲

字符串是最常见的一种数据类型,在现实生活中,比较适合用字符串表示的对象包括名字、诗词等。字符串表示一组有序的字符集合,如“床前明月光”就是一个字符串,“床”和“前”都是字符。

所以字符串最基本的属性就是长度,就是包含字符的个数。和其他语言类似,在 Python 中,长度为 0 的字符串也是合法的,也被称作空字符串。但和C语言、Java 语言不同的是,Python 中没有字符这个类型,或者我们可以认为字符就是长度为 1 的字符串。

在 Python 2 中,有两类字符串:
  • 一类是 str 类型的字符,可以看作字节流,一般用来表示使用 ASCII 码字符就能表示的字符串,这类字符串不能直接用来表示中文字符;
  • 另外一类是 unicode 类型的字符串,这类字符串可以用来表示中文。

而在 Python 3 中,只有 str 一种类型,但该类型就是 Python 2 中的 unicode 类型,我们可以用其表示任意字符。原来 Python 2 中的 str 类型在 Python 3 中用 bytes 类型表示。

本节主要讲述 Python 3 中字符串的用法。

字符串可以使用下面 4 种方式来表示:
  • 使用单引号加上一串字符。
  • 使用双引号加上一串字符。
  • 使用 3 个单引号开始,使用 3 个单引号来结束,中间放上一串字符。
  • 使用 3 个双引号开始,使用 3 个双引号来结束,中间放上一串字符。

下面是各种字符串表示法的例子:
>>> a = ''         # 使用单引号,空字符串
>>> a = 'abc'      # 使用单引号,包含3个字符,a、b和c
>>> a = ""         # 使用双引号,空字符串
>>> a = "abc"      # 使用双引号,包含3个字符,a、b和c
>>> a = """"""     # 使用3个双引号,空字符串
>>> a = """abc"""  # 使用3个双引号,包含3个字符,a、b和c
>>> a = """abc     # 使用3个双引号,包含换行符
    def            # 第二行
    ekl"""         # 第三行
>>> a              # 查看内容
'abc\ndef\nekl'
>>> a = '''abc     # 使用3个单引号,包含换行符
    def            # 第二行
    ijl'''         # 第三行
>>> a              # 查看内容,可以看到换行符\n
'abc\ndef\nijl'

str 类型的相关接口函数

字符串的基本操作包括得到子字符串、得到字符串的长度等。本节将介绍字符串类型的常用接口函数以及它们的用法。

1) 得到字符串长度——len()

其返回字符串中字符的个数。
>>> len("")     # 空字符串,长度为0
0
>>> len("a")    # 单个字符,所以长度为1
1
>>> len("ab")   # 包含两个字符,所以长度为2
2
>>> len("abc")  # 包含3个字符,所以长度为3
3
>>> a = "我爱python"
>>> len(a)      # 包括8个字符
8

2) 得到子字符串——[开始位置:结束位置]

需要注意的是,字符串是不可以修改的,所以对子字符串是只能读不能写。
>>> in_str="abcdefghijklmn"
>>> in_str[2:]            # 从第三个开始一直到最后
'cdefghijklmn'
>>> in_str[2]             # 仅第三个字符
'c'
>>> in_str[2:5]           # 第3个到第5个字符
'cde'
>>> in_str[2:5]="1234"    # 试图做写操作,失败,抛出异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

3) 是否为26个字母——isalpha()

如果字符串包含多个字符,那么是否所有的字符都是26个字母,包括大小写的字母。
>>> "".isalpha()   # 空字符串不是26个字母
False
>>> "a".isalpha()  # "a"包含的都是26个字母
True
>>> "a1".isalpha()
False
>>> "aB".isalpha()
True

4) 是否全部为 10 个数字字符——isdigit()

该函数用于判断是否所有的字符都是 0 到 9 的字符,如果有一个不是,返回 False,否则返回 True。
>>> "".isdigit()        # 空字符返回False
False
>>> "0".isdigit()       # 单个字符0,返回True
True
>>> "0a".isdigit()      # 包含非数字字符a,返回False
False
>>> "009876".isdigit()  # 全部为数字字符,返回True
True

5) 是否为26个字母或者10个数字字符——isalnum()

如果字符串中的每个字符都是 26 个字母或者 10 个数字字符,返回 True;如果有一个不是这个范围内的字符,返回 False。
>>> "009876".isalnum()   # 都符合要求
True
>>> "a009876".isalnum()  # 都符合要求
True
>>> "".isalnum()         # 空字符串,返回False
False
>>> "abc_def".isalnum()  # _字符不符合要求,所以返回False
False

6) 转换成小写字母——lower()

该函数将所有的大写字母都转换成小写字母,其他字符原封不动。
>>> "abCD987".lower()  # CD => cd, 其他没有变化
'abcd987'

7) 转换成大写字母——upper()

该函数将所有的小写字母都转换成大写字母,其他字符原封不动。
>>> "abCD987".upper()  # ab    => AB
'ABCD987'
>>> "我爱python".upper()
'我爱PYTHON'

8) 将单词的首字母大写——title()

如果有多个单词,那么每个单词的首字母都变成大写的。
>>> "abc".title()                        # 仅仅包含一个单词
'Abc'
>>> "this is our favorite book".title()  # 包含多个单词,每个的首字母都大写
'This Is Our Favorite Book'

9) 分割成字符串列表——split(分割字符)

分割字符可以是单个字符,也可以是一个字符串。下面的例子中既有单个字符组成的分割字符,也有多个字符组成的分割字符。
>>> "a:b:c".split(":")            # 分割字符是单个字符
['a', 'b', 'c']
>>> "abc--def".split('--')        # 分割字符是两个字符
['abc', 'def']
>>> "abc:def:".split(':')         # 尾部有分割字符
['abc', 'def', '']
>>> "::::abc:def::::".split(':')  # 头部有分割字符,有连续的分割字符
['', '', '', '', 'abc', 'def', '', '', '', '']

10) 将字符串列表拼接成一个字符串——join(字符串列表)

该接口函数接收一个字符串列表或者元组,返回一个新的字符串,输入的字符串集合不会发生变化。返回的字符串就是用指定的字符连接起来的。

下面的例子使用“:”来连接输入的字符串列表。
>>> ":".join(['a', 'b', 'c'])
'a:b:c'

11) 得到字符的ASCII码——ord(单个字符)

要求输入是包含单个字符的字符串。

ASCII 码是早期的一种编码方式,使用 8 位来表示一个字符。目前这种编码方式依然广泛使用,但这种表示方法无法表示中文。
>>> ord("a")   # 字符a的ASCII码是97
97
>>> ord("x")   # 字符x的ASCII码是120
120
>>> ord("?")
63
>>> ord("ab")  # 两个字符,抛出异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 2 found

12) 从 ASCII 码得到字符——chr(ASCII码值)

输入参数必须在 0 到 255 之间,超出范围会抛出异常。
>>> chr(0)  # ASCII码中0表示的字符
'\x00'
>>> chr(255)
'\xff'
>>> chr(36)
'$'
>>> chr(2236)  # 超出范围,导致抛出异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: chr() arg not in range(256)