声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是由我所写,所以不如我的AI技术教学风趣幽默,学起来比较枯燥;但它的知识点还是讲到位的了,也值得阅读!PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!

我们知道字符串是不可变的,所以不能在原处直接对其进行修改。为了在已存在的字符串中创建新的文本值,我们可以通过分片和合并这样的操作来建立新的字符串。举个例子,为了替换一个字符串中的两个字符,你可以用如下代码来完成:

>>> S = 'spammy'

>>> S = S[:3] + 'xx' + S[5:]

>>> S

'spaxxy'

但是,如果仅为了替换一个子字符串的话,那么可以使用字符串的replace方法来实现:

>>> S = 'spammy'

>>> S = S.replace('mm','xx')

>>> S

'spaxxy'

replace方法的参数是原始子字符串(任意长度)和替换原始子字符串的字符串(任意长度),之后进行全局搜索并替换:

>>> 'aa$bb$cc$dd'.replace('$','SPAM')

'aaSPAMbbSPAMccSPAMdd'

也通过使用字符串方法find搜索子字符,之后再使用分片来替换字符串,但是过程很繁琐:

>>> S = 'xxxxSPAMxxxxSPAMxxxx'

>>> where = S.find('SPAM') # Search for position

>>> where # Occurs at offset 4

4

>>> S = S[:where] + 'EGGS' + S[(where+4):]

>>> S

'xxxxEGGSxxxxSPAMxxxx'

replace方法还可以指定替换多少个。如果不指定就是替换所有找到的子字符串:

>>> S = 'xxxxSPAMxxxxSPAMxxxx'

>>> S.replace('SPAM','EGGS') # Replace all

'xxxxEGGSxxxxEGGSxxxx'

>>> S.replace('SPAM','EGGS',1) # Replace one

'xxxxEGGSxxxxSPAMxxxx'

注意replace每次会返回一个新的字符串对象。由于字符串是不可变的,因此每一种方法并不是真正在原处修改了字符串,尽管“replace”就是“替换”的意思!

合并操作和replace方法每次运行会产生新的字符串对象,实际上利用它们去修改字符串是一个潜在的缺陷。如果你不得不对一个超长字符串进行许多的修改,为了优化脚本的性能,可能需要将字符串转换为一个支持原处修改的对象。

>>> S = 'spammy'

>>> L = list(S)

>>> L

['s','p','a','m','m','y']

内置的list函数以任意序列中的元素创立一个新的列表——在这个例子中,它将字符串的字符“打散”后构建出一个列表。一旦字符串以这样的形式出现,你无需在每次修改后进行复制就可以对其进行多次修改:

>>> L[3] = 'x'  # Works for lists,not strings

>>> L[4] = 'x'

>>> L

['s','p','a','x','x','y']

修改之后,如果你需要将其变回一个字符串(例如,写入一个文件时),可以用字符串方法join将列表“合成”一个字符串:

>>> S = ''.join(L)

>>> S

'spaxxy'

可能第一眼看上去连接方法有些奇怪。因为它是用于字符串的方法(并非用于列表),所以通过设定的分隔符来调用。join将列表字符串连在一起,并用分隔符隔开。这个例子中使用一个空的字符串分隔符将列表转换为字符串。一般地,对任何字符串分隔符和可迭代字符串都会是这样的结果:

>>> 'SPAM'.join(['eggs','sausage','ham','toast'])

'eggsSPAMsausageSPAMhamSPAMtoast'

实际上,像这样一次性连接子字符串比单独地合并每一个要快很多。


我的微信公众号是“人工智能知识分享”

python系列教程90_字符串