Python学习精粹020:字符串及其简单操作

本文详细介绍了Python中字符串的基本概念,包括如何通过索引和切片获取和修改字符串,以及字符串的连接、复制、查找子字符串和原始字符串操作。
摘要由CSDN通过智能技术生成

一、什么是字符串

字符串是由零个或多个字符组成的有限序列,在编程语言中,是用以表示文本的数据类型。在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值