字符串的高级方法*

  • 字符串方法

前面的章节我们讲了字符串的一些简单方法(相加、与整数相乘和索引)。现在,我们来看Python还可以对字符串执行哪些有用的操作。

大小写转换————我们可以利用capitalize()将字符串中的第一个字符转换为大写(前提是第一个字符是一个字母),其余字母转换为小写:

>>> s_1 = 'hello, iT\'s mE'
>>> s_1.capitalize()
"Hello, it's me"

也可以利用upper()将所有字母转化为大写,或者lower()将所有字母转化为小写:

>>> s_1.upper()
"HELLO, IT'S ME"
>>> s_1.lower()
"hello, it's me"

 

空格消除————我们可以利用lstrip()、rstrip()和strip()来消除字符串最左端、最右端或者两端的空格:

>>> s_2 = '   example   '
>>> s_2.lstrip()
'example   '
>>> s_2.rstrip()
'   example'
>>> s_2.strip()
'example'

 

查找特定字符————我们可以利用find()完成:

>>> s_3 = 'boomshakalaka!'
>>> s_3.find('a')
6
>>> s_3.find('!')
13

我们注意到,虽然字符’a’在这个字符串里面出现了四次,但是find()只返回’a’首次出现位置的索引号。
字符计数————我们可以用count()来数数特定字符在字符串中出现了几次:

>>> s_3.count('ka')
2
>>> s_3.count('a')
4

 

字符更替————我们可以用replace()来替换掉字符串中的特定字符:

>>> s_3.replace('boom','bang')
'bangshakalaka!'

我们注意到,替换的时候,被替换的字符写在逗号左边,新字符写在逗号右边。

 

字符串分割————我们可以用split()以特定字符为分节符,分割字符串,然后获得一个列表,这个列表里面的元素是分割开来的字符串:

>>> s_4 = 'I am learning Python!'
>>> s_4.split()
['I', 'am', 'learning', 'Python!']
>>> s_5 = 'Peter, Alicia, Brian, Sofia'
>>> s_5.split(', ')
['Peter', 'Alicia', 'Brian', 'Sofia']

我们注意到,如果直接使用split(),那么Python就把原来字符串中的所有空格当做分节符,把字符串分成了若干个新的字符串,并把它们全放到了列表里面。我们也可以在split()的括号内,自定义一个分节符,例如s_5中,我们用一个逗号和一个空格’, ‘这个字符串来分界,就可以把所有的人名放到一个列表里了。

提示:当直接使用split()的时候,如果两个字符之间有多个空格,Python会将其识别为一个分隔符。例如,字符串’a b’和字符串’a             b’尽管中间空格数量不同,但使用默认split()分割的结果是一样的。

 

映射转换*————有点费解的一个功能,但是很好用很常用,以后常回来看看。我们可以先通过str.maketrans()建立一个映射,然后利用translate()和这个映射去转换其他字符串,我们先看例子:

>>> s_6 = 'This_is@a-very!weird=sentence.'
>>> table = str.maketrans('_@-!=',' '*5)
>>> s_6.translate(table)
'This is a very weird sentence.'

我们看到,第一行中的s_6是一个奇怪的句子,本来应该空格的地方却是一堆符号。

第二行,我们利用str.maketrans()建立了一个映射,我们把本该是空格位置的符号写成一个字符串放在括号内逗号左边,逗号右边则是一个由5个空格组成的字符串,意思是说,我们把逗号左边的字符串中的每个字符与逗号右边字符串中的每个字符一一对应起来。接着,我们把这个一一对应(映射)关系存放在table这个变量里面。

第三行,我们对原先奇怪的句子s_6实施translate()这个操作,translate的依据,则是我们刚才建立的映射table。

第四行,返回结果,我们将句子中所有的符号,转换成了符号对应的字符————空格。

这里我们重申一点,空格也是一个字符,’ ‘和空字符串”区别大大滴有。

 

  • 字符串切片

之前我们讲过字符串索引,实际上利用索引号,我们还可以对字符串进行更复杂的操作————切片。让我们先创建一个简单的字符串:

>>> s_7 = 'hello'
>>> s_7[0]
'h'

现在,我们在索引的中括号里面加入一个冒号和一个新的索引号:

>>> s_7 = 'hello'
>>> s_7[0:2]
'he'

我们看到,Python这时候返回了字符串的前两个字符组成的新字符串。也就是说,一个字符串s,如果我们对他进行s[x:y]的操作,Python将返回这个字符串索引号为x的字符开头,索引号为y-1的字符结尾的新字符串,这称为切片(slicing)。

如果切片开始的位置是字符串的首位,或者切片结束的位置是字符串的末位,我们可以如下简写:

>>> s_7[:3]
'hel'
>>> s_7[-3:]
'llo'

 

  • 又见不可变对象

在本章第四节中,我们初次接触了可变对象与不可变对象,你应该还对那个萝卜西瓜和花生的故事有点印象。学习了字符串的高级方法之后,我们可以对字符串这个“不可变对象”有更深的认识。

任意创建一个字符串并对其进行任意个我们上面讲的字符串方法操作,例如:

>>> string = 'whatever this is   '
>>> string.strip()
'whatever this is'
>>> string
'whatever this is   '
>>> string.replace('whatever', 'haha')
'haha this is   '
>>> string
'whatever this is   '
>>> string.capitalize()
'Whatever this is   '
>>> string
'whatever this is   '

我们发现,方法倒是奏效了,Python也返回了对应的结果,但是string这个变量所指的对象————那个“坑”————里面的东西没有发生变化。这说明,字符串真的是不可变对象,所有的方法所谓的改变、更替,实际上都是Python重新创建了一个新的字符串给我们。

那你会问,那上述新创建的三个字符串哪去了?嗯,我们没有用一个新的“坑”把它们装起来,所以现在找不到它们了。怎么样才能保存我们新生成的字符串呢?答案是用一个新的变量来装它们:

>>> new_string = string.capitalize()
>>> new_string
'Whatever this is   '
>>> string
'whatever this is   '

 


字符串的操作方法就这些了吗?No骚年!这些是常用的,想知道所有的字符串操作方法吗!在IDLE里面输入help(str)试试~

 

  • 本节练习

把这句话里每个人名作为一个元素,放进一个列表里,看看一共有几个名字:I have many girl friends: Capri, Amy, Lily, Wang, Sofia, Dora, Mia, Miley, Olivia, Brielle, Rue, Alice, Cora, Violet, Anna, Bella, Lucy, Lydia, Ella, Jean, Jane, Chole, Ada, Julie, Jackie, Gemma, Eloid, Zelda, Cecelia, Rose, Rebecca, Louisa, Sammy, Jasmine, Allison, Morgan, Victoria, Claudia, Candice, Crystal, Rachel, Grace, Elizabeth, Mofy, Momoko, Angelica, Kelly, Sarah, Hannah, Tomoya, Molly!

看答案

>>> s = 'I have many girl friends: Capri, Amy, Lily, Wang, Sofia, Dora, Mia, Miley, Olivia, Brielle, Rue, Alice, Cora, Violet, Anna, Bella, Lucy, Lydia, Ella, Jean, Jane, Chole, Ada, Julie, Jackie, Gemma, Eloid, Zelda, Cecelia, Rose, Rebecca, Louisa, Sammy, Jasmine, Allison, Morgan, Victoria, Claudia, Candice, Crystal, Rachel, Grace, Elizabeth, Mofy, Momoko, Angelica, Kelly, Sarah, Hannah, Tomoya, Molly!'
>>> new_s = s[s.find('C'):-1]
>>> name_list = new_s.split(', ')
>>> name_list
['Capri', 'Amy', 'Lily', 'Wang', 'Sofia', 'Dora', 'Mia', 'Miley', 'Olivia', 'Brielle', 'Rue', 'Alice', 'Cora', 'Violet', 'Anna', 'Bella', 'Lucy', 'Lydia', 'Ella', 'Jean', 'Jane', 'Chole', 'Ada', 'Julie', 'Jackie', 'Gemma', 'Eloid', 'Zelda', 'Cecelia', 'Rose', 'Rebecca', 'Louisa', 'Sammy', 'Jasmine', 'Allison', 'Morgan', 'Victoria', 'Claudia', 'Candice', 'Crystal', 'Rachel', 'Grace', 'Elizabeth', 'Mofy', 'Momoko', 'Angelica', 'Kelly', 'Sarah', 'Hannah', 'Tomoya', 'Molly']
>>> len(name_list)
51

酱哦

请用切片的方法将字符串:
‘i9rhasiou23090_234rhioasdcvoif2903j69spgjanodvp!dfo02uiopvae+890p23uivah@u80q23i9o0asd’
的后21个字符切片为新的字符串。

看答案

>>> s = 'i9rhasiou23090_234rhioasdcvoif2903j69!dfo02uiopvae+890p23uivah@u80q23i9o0asd'
>>> s[-21:]
'23uivah@u80q23i9o0asd'

酱哦

【选做】请将余光中先生的现代诗《算命瞎子》节选中所有标点转换为换行:

凄凉的胡琴拉长了下午,偏街小巷不见个主顾;他又抱胡琴向黄昏诉苦:空走一天只赚到孤独!

提示


转义字符\后加n可以实现对字符串换行。例如

>>> print('hello\nbaby')
hello
baby

再想想


看答案

>>> poem = '凄凉的胡琴拉长了下午,偏街小巷不见个主顾;他又抱胡琴向黄昏诉苦:空走一天只赚到孤独!'
>>> tabel = str.maketrans(',:;!', '\n'*4)
>>> format_poem = poem.translate(table)
>>> print(format_poem)
凄凉的胡琴拉长了下午
偏街小巷不见个主顾
他又抱胡琴向黄昏诉苦
空走一天只赚到孤独

酱哦


如果还有什么问题或者发现了文章的错误,欢迎给我留言!邮箱可以随便乱写 ~

发表评论

电子邮件地址不会被公开。 必填项已用*标注