一、什么是字符串
字符串是由零个或多个字符组成的有限序列,在编程语言中,是用以表示文本的数据类型。在Python中,将零个或多个字符用单引号、双引号或三引号括起来,即为字符串,如下所示:
'This is a string.'
"This is another string."
>>> msg = '''Hello World'''
>>> print(msg)
Hello World
二、使用索引[]获取字符串位置
字符串是由零个或多个字符组成的有限序列,通过索引可访问字符串中的字符。字符串的索引从左往右从0开始,从右往左则从-1开始,以此类推,如下图所示:
请看下面的示例:
>>> print('string'[0])
s
>>> print('string'[1])
t
>>> print('string'[-1])
g
>>> print('string'[-2])
n
需要注意的是,字符串索引必须为整数,且不可超出范围。
如字符串的索引为不为整数,会引发类型错误(TypeError),且提示字符串的索引必须为整数(TypeError: string indices must be integers, not 'float')。
如字符串的索引超出范围,会引发索引错误(IndexError),且提示字符串的索引超出范围(IndexError: string index out of range)。
如下所示:
>>> print('string'[0])
s
>>> print('string'[0.1])
<stdin>:1: SyntaxWarning: str indices must be integers or slices, not float; perhaps you missed a comma?
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: string indices must be integers, not 'float'
>>> print('string'[10])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
>>> print('string'[10])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
三、使用切片[::]获取一部分字符串
通过对字符串指定索引范围(开始索引与结束索引)来创建切片,可以获取字符串的一部分,其中,开始索引默认为0,结束索引默认为字符串的长度。
如下所示:
>>> str1 = "Happiness"
>>> # 获取字符串中的第1个字符
>>> print(str1[0])
H
>>> # 获取字符串中的第1个(索引为0)至第3个(索引为2)字符
>>> print(str1[0:3])
Hap
>>> print(str1[:3])
Hap
>>> # 获取第6个字符(索引为5)至最后一个字符
>>> print(str1[5:])
ness
>>> print(str1[5:len(str1)])
ness
>>> # 获取整个字符串(开始索引默认为0,结束索引默认为字符串长度)
>>> print(str1[:])
Happiness
其中,索引范围遵循左闭右开的原则,如str1[0:3]会获取第1个字符(索引为0)至第3个字符(索引为2)。
看看下面的代码:
>>> str1 = "Happiness"
>>> # 获取字符串中倒数第3个字符
>>> print(str1[-3])
e
>>> # 获取字符串中倒数第5个至倒数第1个字符
>>> print(str1[-5:])
iness
>>> # 获取字符串中倒数第5个至倒数第3个字符
>>> print(str1[-5:-2])
ine
>>> # 获取第1个字符至倒数第6个字符
>>> print(str1[:-5])
Happ
>>> # 获取整个字符串,通过len()获取字符串长度
>>> print(str1[-len(str1):])
Happiness
此外,对字符串切片时可以指定步长(默认为1),请看下面的例子:
>>> # 以默认步长(1)的方式切片,获取整个字符串
>>> print(str1[::])
Happiness
>>> # 为步长为1的方式切片,获取字符串中的第1个(索引为0)至第5个字符(索引为4)
>>> print(str1[0:5:])
Happi
>>> print(str1[0:5:1])
Happi
>>> # 以步长为2的方式切片,获取字符串中的第1个(索引为0)至第5个字符(索引为4)
>>> print(str1[0:5:2])
Hpi
>>> # 以步长为2的方式切片,获取整个字符串
>>> print(str1[::2])
Hpies
此外,也可以让步长的参数值为负整数,实现字符串序列的反转,如下所示
>>> str2 = 'abcd'
>>> print(str2[::-1])
dcba
>>> str3 = ['a', 'b', 'c', 'd']
>>> print(str3[::-1])
['d', 'c', 'b', 'a']
此外,也可以用切片替换字符串序列中的元素,如:
>>> str3[0:2] = ('1', '2')
>>> print(str3)
['1', '2', 'c', 'd']
>>> str3[0:2] = ('A', 'B')
>>> print(str3)
['A', 'B', 'c', 'd']
>>> print(str3[::2])
['A', 'c']
>>> str3[::2] = ('1', '3')
>>> print(str3)
['1', 'B', '3', 'd']
>>> str3[-2:-1] = ('c')
>>> print(str3)
['1', 'B', 'c', 'd']
>>> str3[:-1] = ('123')
>>> print(str3)
['1', '2', '3', 'd']
>>> str3[:1] = ('0', '1')
>>> print(str3)
['0', '1', '2', '3', 'd']
>>> print(str3[-1])
d
>>> str3[-2:-1] = ('3', '4')
>>> print(str3)
['0', '1', '2', '3', '4', 'd']
>>> str3[-1] = ('5')
>>> print(str3)
['0', '1', '2', '3', '4', '5']
>>> str3[::] = 'a'
>>> print(str3)
['a']
四、连接两个字符串
可直接通过加号(+)将两个字符串拼接在一起,成为一个新的字符串,如:
>>> message = 'Life is simple, ' + 'you just make a choice.'
>>> print(message)
Life is simple, you just make a choice.
此外,连接操作符(+)也可以用来拼接两个序列(如列表、元组),具体见下面的例子:
>>> list1 = [1, 2, 3] + [4, 5]
>>> print(list1)
[1, 2, 3, 4, 5]
>>> list2 = [1, 2, [3, 4]] + [5, 6, [7, 8]]
>>> print(list2)
[1, 2, [3, 4], 5, 6, [7, 8]]
>>> list3 = [[1, 2], [3, 4]] + [5, 6, [7, 8]]
>>> print(list2)
[1, 2, [3, 4], 5, 6, [7, 8]]
>>> tuple1 = ('A', 'B', 'C') + ('a', 'b')
>>> print(tuple1)
('A', 'B', 'C', 'a', 'b')
>>> tuple2 = (('A', 'B'), 'C') + ('a', ('b', 'c'))
>>> print(tuple2)
(('A', 'B'), 'C', 'a', ('b', 'c'))
需要注意的是,在字典之间不能使用连接操作符(+),否则将引发类型错误:“TypeError: unsupported operand type(s) for +: 'dict' and 'dict'”。
如下所示:
>>> dict1 = {'A': 1, 'B': 2, 'C': 3} + {'a': 'one', 'b': 'two'}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
字符串之间通过空格会自动连接,如下所示:
>>> 'Veni' 'Vidi' 'Vici'
'VeniVidiVici'
>>> print('Veni' 'Vidi')
VeniVidi
需要注意的是,如已将字符串赋值给变量,变量之间并不能通过空格自动连接,否则会引发语法错误(SyntaxError)。
如下所示:
>>> str1 = 'Veni'
>>> str2 = 'Vidi'
>>> str1 str2
File "<stdin>", line 1
str1 str2
^^^^
SyntaxError: invalid syntax
当字符串跨多行时,可使用反斜杠(\)进行连接。
如下所示:
>>> str1 = 'Veni'\
... 'Vidi'\
... 'Vici'
>>> print(str1)
VeniVidiVici
此外,还可以使用%格式化字符串、字符串的format()方法来进行连接。
如下所示:
>>> str1 = 'Veni'
>>> str2 = 'Vidi'
>>> str3 = 'Vici'
>>> print('%s%s%s'%(str1, str2, str3))
VeniVidiVici
>>> "{str1}Vidi{str3}".format(str1="Veni", str3="Vici")
'VeniVidiVici'
>>> "{str1}Vidi{str3[0]}".format(str1="Veni", str3="Vici")
'VeniVidiV'
>>> "{str1}Vidi{str3[2]}".format(str1="Veni", str3="Vici")
'VeniVidic'
五、使用*进行多重复制
可以通过星号(*)来实现字符串的多重连接(或称之为多重复制),如下所示:
str1 = 'Repeat'
print(str1 * 5)
将会输出:
RepeatRepeatRepeatRepeatRepeat
对于序列(如列表、元组),也可使用多重连接,见下面的例子:
list1 = ['1', '2', '3']
print(list1 * 2)
# 输出:['1', '2', '3', '1', '2', '3']
list2 = [1, 2, 3]
print(list1 * 2)
# 输出:['1', '2', '3', '1', '2', '3']
list3 = [['a', 'b', 'c'], 1, 2, 3]
print(list3 * 2)
# 输出:[['a', 'b', 'c'], 1, 2, 3, ['a', 'b', 'c'], 1, 2, 3]
tuple1 = ('a', 'b', 'c', (1, 2, 3)) * 2
print(tuple1)
# 输出:('a', 'b', 'c', (1, 2, 3), 'a', 'b', 'c', (1, 2, 3))
同样地,在字典之间不能使用多重连接(*),否则将引发类型错误:“TypeError: unsupported operand type(s) for *: 'dict' and 'int'”。试着执行下面的代码:
dict1 = {'A': '1', 'B': '2', 'C': '3'} * 2
print(dict1)
六、使用in与not in查找子字符串
通过字符串运算符in和not in,可以查找字符串中是否包含了子字符串,如下所示:
str1 = "Whatever you do, do not let go!"
print('ever' in str1)
# 输出:True
print('your' in str1)
# 输出:False
print('your' not in str1)
# 输出:True
str2 = "指如削葱根,口如含朱丹"
print('含' in str2)
# 输出:True
print('不含' not in str2)
# 输出:True
七、原始字符串操作符(r/R)
在字符串前加上r(或R)表示原始字符串(raw string),此时,可以规避反斜杠(\)对字符串进行转义。如:
print(r'\n'r'\t'r'\\')
# 输出原始字符串:\n\t\\
print(R'\u263A')
# 输出原始字符串:\u263A,而非☺
print(r'c:\Windows\System32')
# 输出原始字符串:c:\Windows\System32