Python 极简教程(八)字符串 str

由于字符串过于重要,请认真看完并保证所有代码都至少敲过一遍。

对于字符串,前面在数据类型中已经提到过。但是由于字符串类型太过于常用,Python 中提供了非常多的关于字符串的操作。而我们在实际编码过程中,又经常会与字符串打交道。所以这里字符串单独列出一节来讲解。

字符串是由一对引号(单双引号都可以)括起来进行标识。字符串的数据类型是 str , 同时字符串也是一种序列。

定义一个字符串:

>>> s = 'nemo'
>>> s1 = '中文'   
>>> s2 = "Python 极简教程"
>>> s3 = '''      # 多行字符串,用三对引号(三个单引号或者三个双引号)
Python 极简教程
希望大家多提意见
顺便点个喜欢
'''

字符串操作

字符串的操作有很多与列表类似,因为字符串和列表同样都是序列。
1. 字符串相加(拼接)

>>> s = '懒猫'
>>> s1 = 'nemo'
>>> s + s1
'懒猫nemo'

2. 字符串乘法

>>> s = 'nemo'
>>> s * 3
'nemonemonemo'

3. 成员运算

>>> ms = 'n'
>>> s = 'nemo'
>>> ms in s
True
>>> 'x' in s
False
>>> 'x' not in s
True

# 也可以判断连续字符串
>>> 'em' in s
True

4. 通过索引取字符
字符串通过索引取字符的方式与列表中的取值相同。字符串中的每个字符相当于字符串的每个元素,索引从0开始

>>> s = 'nemo'
>>> s[1]    
'e'

格式化字符串

1. 使用 % 格式化

格式化字符串,本义是在打印的时候可以将打印出来的字符串格式化后输出(控制台,也就是打印语句的输出),这样字符串看起来更加整洁美观。
但是实际编码过程中,很少直接通过控制台输出,所以更多的时候,格式化字符串用来将字符串中的部分字符串用参数代替。
例如,从键盘接收两个输入,分别是姓名和爱好,然后输出* x 的爱好是 y *(x 用输入的姓名代替,y 用输入的爱好代替)

name = input('请输入姓名:')
fondness = input('请输入爱好:')
print('%s 的爱好是 %s !' % (name, fondness))

以上代码,用 IDLE 新建一个文件,运行效果更好。

'%s 的爱好是 %s !' % (name, fondness)  

上面的%s 的爱好是 %s !就是格式化字符串,%为占位符,s表示占位的数据格式为字符串。
引号后面的 % 为固定格式
(name, fondness) 是实际的参数,需要和前面的 % 数量一致,数量不一致就会报错。如果只有一个 % 就不需要括号

# 只有一个参数的情况
>>> name = 'nemo'
>>> '你的名字是 %s!' % name
'你的名字是 nemo!'
# 还可以先存起来,后面再赋值
>>> s = '你的名字是 %s!'
>>> s % 'nemo'
'你的名字是 nemo!'

其他还有很多格式化的用法,因为实际使用比较少,这里就不再赘述。有兴趣的可以查阅相关资料。

2. 使用 format 函数

format 函数是 Python 官方目前主推的格式化用法。但是同样我们实际很少需要在控制台上输出,因此主要还是用它来进行字符串内部字符的参数化。
format 函数的占位符为 {},可以是空的 {},后面实际赋值的时候按照 {} 出现的顺序依次赋值。也可以在 {} 中加上索引,如{0},{1}等,0 代表后面的第一个实际值,1为第二个,依次类推。还可以在 {} 中加上名称, 如 {name}, {fondness},那么会以该名称赋值。
示例如下:

# 以三种方式修改上面的例子
#1. 空的 {} 占位
name = input('请输入姓名:')
fondness = input('请输入爱好:')
print('{} 的爱好是 {}!'.format(name, fondness)) # 写法上注意一下  字符串.format()

#2. 加上索引
name = input('请输入姓名:')
fondness = input('请输入爱好:')
print('{1} 的爱好是 {0}!'.format(fondness, name))    # 故意更换了一下位置,对比一下

#3. 加上名称
name = input('请输入姓名:')
fondness = input('请输入爱好:')
print('{n} 的爱好是 {f}!'.format(f=fondness, n=name))  # 前面 {} 加了名字,在后面就写成 名称=值(变量)

上面的例子,故意调整了一下顺序和名称,自己动手练练,感受一下。

3. f 字符串

f-string是 Python 3.6 中定义的一种参数化字符串的方式,主要是让格式化字符串更加便捷。
f-string 中,不要再使用 %-格式化 或者 format 函数中的复杂写法,可以直接在字符串中写入变量名。f-string 用 {} 标识变量,区别在于 {} 不再是用来占位的,而是直接写入变量名。
修改上面的格式化例子:

name = input('请输入姓名:')
fondness = input('请输入爱好:')
print(f'{name} 的爱好是 {fondness}!')    # 字符串前面的 f 大小写均可

除此之外,还可以在f-string中使用函数和表达式:

# 显示当前时间
>>> import time    # 引入时间库
>>> print(f'当前时间是 {time.ctime()}!')    # time.ctime() 为显示当前时间的函数
当前时间是 Tue Mar 19 23:30:49 2019!

# 直接在字符串中进行运算
>>> x = 10
>>> y = 5
>>> F'x + y = {x+y}'
'x + y = 15'

可谓非常方便实用,而且据说速度优于其他的格式化方式。

r 字符串

字符串中如果出现 反斜杠 \会出现一些不同的意思,比如\n表示换行,\t制表符(Tab)等等,如果你想表示一个 Windows 路径的时候,比如C:\test\nemo,那么实际打印的时候会变成如下的样式:

>>> path = 'C:\test\nemo.txt'
>>> print(path)
C:  est
emo.txt

如果是操作文件的时候,就会出现各种异常。因此为了避免其中的特殊字符造成字符串不是原来的意思,我们可以使用 r(大小写都可以)来将字符串中的特殊字符全部定义为普通字符。

>>> path = r'C:\test\nemo'  # r 写在字符串第一个引号前面
>>> print(path)
C:\test\nemo

字符串常用内置方法

以下仅列出较为常用的内置方法,其余方法请参考其他资料。(写太多不常用的内容,就称不上极简教程了)
注意:其中部分极少使用的默认参数也已去掉
下面这些方法非常常用,需要背下来,就算不能背下来,至少要知道有这些方法。

方法 说明
str.strip() 删除字符串前后空格
str.replace(old, new) 把将字符串中的 old 替换成 new
str.join(seq) 以指定字符串作为分隔符,将 seq 中所有的元素合并为一个新的字符串
str.split(obj) 以 obj 为分隔符切割字符串,生成一个列表
str.find(obj) 检测 obj 是否包含在字符串中 str中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1
str.index(obj) 跟find()方法一样,只不过如果str不在字符串中会报一个异常
string.startswith(obj) 检查字符串是否是以 obj 开头。是则返回 True,否则返回 False
string.endswith(obj) 检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束。如果是,返回 True,否则返回 False
string.upper() 转换 string 中的小写字母为大写
string.lower() 转换 string 中所有大写字符为小写

1. str.strip() 去前后空格

我们在进行登录的时候,偶尔手抖在账号前或后输入了一个空格,也能登录成功;有些系统又不行。之所以能登录成功,其实是因为开发人员做了处理,帮你去掉了不小心在账号前后输入的空格。这就是 strip 这个方法的用途。

>>> s = '  nemo  '    # 前后有空格
>>> s.strip()
'nemo'

2. str.replace(old, new) 替换

字符串替换,用于将字符串中的某部分内容替换成新的字符串。

# 将下面字符串中的'+'加号,替换成','逗号。
>>> s = 'MP3+pdf+doc+txt'
>>> s.replace('+', ',')      # 被替换的字符串在前,替换后的字符串在后      
'MP3,pdf,doc,txt'

3. str.join(seq) 字符串组合

字符串组合,是将列表中的字符串元素组合成一个完整的字符串。使用指定的字符串来分隔组合好的字符串。
这个方法是比较容易出错的,组合的字符串在'.'前面,列表是作为参数放在括号中。

# 比如列表中有多个单词,想组成一句话
>>> words= ['it', 'was', 'the', 'season', 'of', 'Light']
>>> ' '.join(words)    # 用空格分隔,空格要放在前面
'it was the season of Light'

# 小练习 1
>>> li = ['a', 'b', 'c']  # 组合成 a_b_c
>>> face = ['*', '_', '*']  # 组合成 *_*

注意,列表中必须全部是字符串,如果存在其他数据类型则会报错。

4. str.split(obj) 切割字符串

以传入的obj 为分隔符切割字符串,生成一个列表。七号和上面的 join 方法是反过来的。
比如:

# 将下面的英文句子拆分为单个的英文的单词
>>> s = 'this is a pig'
>>> s.split()    # 默认按空格进行拆分
['this', 'is', 'a', 'pig']    # 拆出后的结果是一个列表

# csv文件是以逗号分隔的一种文件格式。将下面以逗号分隔的内容拆分成一个列表
>>> s = '张三,男,30,170'
>>> s.split(',')    # 按逗号拆分,括号中把逗号作为字符串传入
['张三', '男', '30', '170']

# 小练习 2
# 1. 从键盘接收一组数字输入,数字以逗号分隔。返回这一组数字中的最大最小值
# 2. 从键盘接收一组数字,数字以空格分隔。反向后输出

5. 字符串查找

str.find(obj)
从左边开始查找整个字符串,返回找到匹配的字符的起始位置索引。如果找不到则返回 -1。

>>> s = 'it was the season of Darkness'
# 找到其中 of 所在的索引
>>> s.find('of')    # 找到则返回 of 开始的索引值
18
>>> s.find('nemo')    # 找不到返回 -1
-1

str.index(obj)
查找的结果与 find 方法一样。不同的是,找不到的时候,会报错。

>>> s = 'it was the season of Darkness'
# 找到其中 of 所在的索引
>>> s.index('of')
18
>>> s.index('nemo')
ValueError: substring not found    # 报子串不存在的错误

6. 字符串判断

用于判断字符串是否以什么开头或者以什么结尾。
str.startswith(obj)
检查字符串是否是以指定的obj字符串开头。是则返回 True,否则返回 False

>>> s = 'it was the season of Darkness'
>>> s.startswith('it')    # 注意 startswith,start 后面有个 s,starts
True
>>> s.startswith('ness')
False

str.endswith(obj)
检查字符串是否是以指定的obj字符串结尾。是则返回 True,否则返回 False

>>> s = 'it was the season of Darkness'
>>> s.endswith('ness')    # 注意 endswith,end 后面也有个s
True
>>> s.endswith('it')
False

7. 大小写转换

string.upper()
把字符串中的小写字母全部转换成大写字母。

>>> s = 'nEmO'
>>> s.upper()
'NEMO'

str.lower()
把字符串中的大写字母全部转换成小写字母。

>>> s = 'nEmO'
>>> s.lower()
'nemo'

# 小练习 3
# s = 'NemO'
# s == 'nemo'  改造这个等式,使之返回 True

小练习答案:

# 小练习 1
>>> li = ['a', 'b', 'c']  # 组合成 a_b_c
>>> '_'.join(li)
>>> face = ['*', '_', '*']  # 组合成 *_*
>>> ''.join(face)
# 小练习 2
# 1. 从键盘接收一组单词,以逗号分隔。返回这一组单词中的最大最小值
>>> s = input('请输入一组单词,以逗号分隔:')
请输入一组单词,以逗号分隔:nemo,leo,nano,aux
>>> li = s.split(',')
>>> max(li)
'nemo'
>>> min(li)
'aux'
# 2. 从键盘接收一组数字,数字以空格分隔。将顺序反向后输出
>>> s = input('请输入一组数字,以空格分隔:')
请输入一组数字,以空格分隔:31 25 14 8 11
>>> li = s.split()
>>> li.reverse()
>>> ' '.join(li)
'11 8 14 25 31' 
# 小练习 3
# s = 'NemO'
# s == 'nemo'  改造这个等式,使之返回 True
>>> s.lower() == 'nemo'        # 这也是实现字符串忽略大小写的写法
>>> s == 'nemo'.upper()      

下一篇 元组

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,423评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,147评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,019评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,443评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,535评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,798评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,941评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,704评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,152评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,494评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,629评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,295评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,901评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,978评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,333评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,499评论 2 348