Python学习笔记(3)之字符串string

0.写在前面

来北京一周了,玩了几个地方,见了几位老同学,发现这座城市有着它独特的魅力,深深吸引着我。不知当初坚持选择来北京是否是一个正确的选择,走走看吧。

鸽了好多天,终于静下心来写点东西啦。现在是零点整,窗外仍时不时地传来车流声。在这个行色匆匆的城市里,稍微停一下脚步就有可能被抛弃。所以,加油吧!自己选择的路就坚持走下去!

PS:再次由衷感谢北京的朋友们的热情款待,争取今年趁大家毕业前去你们的校园里转一转,也祝大家保研or考研or工作顺利!

1.引入

Python处理字符串最神奇的地方在于它将字符串看作是一个序列,因此可以对字符串做各种各样的针对序列的操作。

索引
>>> test = 'Python'
>>> test[3]
'h'
循环
>>> test = 'Python'
>>> for each in test:
        print(each,end='^0^')

P^0^y^0^t^0^h^0^o^0^n^0^
转化成列表
>>> test = 'Python'
>>> list(test)
['P', 'y', 't', 'h', 'o', 'n']
打包(可进一步转化成字典)
>>> test = 'Python'
>>>index = ['1st','2nd','3rd','4th','5th','6th']

>>> zip(index,test)         #打包,得到一个映射
<zip object at 0x000001FC83DC9588>

>>> list(zip(index,test))
[('1st', 'P'), ('2nd', 'y'), ('3rd', 't'), ('4th', 'h'), ('5th', 'o'), ('6th', 'n')]

>>> dict1 = dict(zip(index,test))    #得到字典
>>> print(dict1)
{'1st': 'P', '2nd': 'y', '3rd': 't', '4th': 'h', '5th': 'o', '6th': 'n'}
>>> dict1['3rd']
't'
>>> test = 'Python'
>>> list(enumerate(test))     #利用enumerate函数打包索引值与对应元素
[(0, 'P'), (1, 'y'), (2, 't'), (3, 'h'), (4, 'o'), (5, 'n')]

2. 转义字符串

和其他一些编程语言一样,反斜杠\在Python充当转义字符的作用,即如果字符串中出现特殊字符时可以用反斜杠\进行转义,例如:

>>> print('Let's go!')        
SyntaxError: invalid syntax   #报错

>>> print('Let\'s go!')  
Let's go!

有时字符串中的一些符号组合在一起会出现一些奇怪的现象,例如要想打印C:\now

>>> print('C:\now')   
C:
ow

Python默认将\n识别为换行符。解决这类问题有两种办法,一是通过\对反斜杠进行转义

>>> print('C:\\now')  
C:\now

二是利用原始字符串,即在字符串前加r,这样Python便会忽略字符串中的转移符。

>>> print(r'C:\now')  
C:\now

注:原始字符串不能以\结尾,否则会报错

>>> print(r'C:\now\') 
SyntaxError: EOL while scanning string literal

可以这样处理

>>> print(r'C:\now''\\')
C:\now\

3.字符串的格式化

所谓格式化字符串,可以简单理解为将一种格式的字符串转化成另一种格式。常用的方法有两种:

3.1 百分号%方法

格式为 %[(name)][flags]typecode % tuple or dict

  • (name):可选参数,用于选择指定的key。name存在时,后面应用字典dict。
  • flags:可选辅助参数,在表2中列出。
  • typecodes:必选格式化符号,在表1中列出

表1:字符串格式化符号含义

符号 说明
%c 格式化字符及其 ASCII 码
%s 格式化字符串
%d 格式化整数
%o 格式化无符号八进制数
%x 格式化无符号十六进制数
%X 格式化无符号十六进制数(大写)
%f 格式化浮点数字,可指定小数点后的精度(默认保留小数点后6位)
%e 用科学计数法格式化浮点数
%E 作用同 %e,用科学计数法格式化浮点数
%g 根据值的大小决定使用 %f 或 %e
%G 作用同 %g,根据值的大小决定使用 %f 或者 %E

注:

  1. Python中百分号格式化是不存在自动将整数转换成二进制表示的方式
  2. 当字符串中存在格式化标志%时,需要用 %%表示一个百分号
>>> '%(num)d 的八进制数为 %(num)o' % {'num' : 10}
'10 的八进制数为 12'
>>> 'My name is %s. I`m %d years old.' % ('单嘉伟', 18)
'My name is 单嘉伟. I`m 18 years old.'

表2:格式化操作符辅助命令

符号 说明
m.n m 是显示的最小宽度,n 是小数点后的位数
- 用于左对齐
+ 在正数前面显示加号(+)
# 在八进制数前面显示 '0o',在十六进制数前面显示 '0x' 或 '0X'
0 显示的数字前面填充 '0' 取代空格

注:所谓最小宽度,即若输入的字符长度大于设定值,则无视;小于的话则在前方用空格补齐,即右对齐。

>>> '数数数字前有几个空格%5d' % 25
'数数数字前有几个空格   25'

>>> '%.5f' % 25
'25.00000'

>>> '%+05d' % 2.5
'+0002'

>>> '%#5o' % 17
' 0o21'

3.2 format方法

str.format()方法利用{}:来取代%,可通过位置参数和关键字参数进行格式化

3.2.1 位置参数
>>> '{0} is my best {2}, I love {0} very much!'.format('Python','aha','friend')
'Python is my best friend, I love Python very much!'

{}中不加数字的话,Python会按顺序由前到后索引。

>>> '{} is my best {}, I love {} very much!'.format('Python','friend','Python','aha')
'Python is my best friend, I love Python very much!'
3.2.2 关键字参数
>>> '{name} is my best {relation}, I love {name} very much!'.format(name='Python',relation='friend')
'Python is my best friend, I love Python very much!'

注:

  1. 位置参数和关键字参数可以同时存在,但.format()中必须位置参数在前,关键字参数在后!
>>> '{0} is my best {relation}, I love {0} very much!'.format('Python',relation='friend')
'Python is my best friend, I love Python very much!'
  1. 可用列表及对应索引值改进位置参数
>>> list1 = ['Python' , 'friend']
>>> '{0[0]} is my best {0[1]}'.format(list1)
'Python is my best friend'
  1. 可用字典(映射)改进关键字参数,需在字典前加**
>>> dict1=dict(name='Python',relation='friend')
>>> '{name} is my best {relation}'.format(**dict1)
'Python is my best friend'
3.2.3 格式限定符

语法是在{}中带:

常用的操作符有

  1. ^<>分别是居中、左对齐、右对齐。前面与冒号之间只能是一个字符,表示用于填充的符号;后面跟最小宽度。
>>> '{:>8}'.format(17)
'      17'

>>> '{:a<8}'.format(17)
'17aaaaaa'

>>> '{:.^7}'.format(17)
'..17...'
  1. 格式化浮点数时可用m.nf的形式,m为最小宽度,n为精度。
>>> '{:K^9.3f}'.format(17.1)
'K17.100KK'
  1. b、d、o、x(X) 分别是二进制、十进制、八进制、十六进制
>>> '{:b}'.format(17)   #将17转化成二进制数
'10001'

>>> '{:d}'.format(17)   #将17转化成十进制数
'17'

>>> '{:o}'.format(17)   #将17转化成八进制数
'21'

>>> '{:x}'.format(17)   #将17转化成十六进制数
'11'
  1. ,号还能用来做金额的千位分隔符
>>> '{:,}'.format(250000000000)
'250,000,000,000'

4. 字符串的各类BIF

函数 功能
capitalize() 把字符串的第一个字符改为大写
casefold() 把整个字符串的所有字符改为小写
center(width) 将字符串居中,并使用空格填充至长度 width 的新字符串
count(sub[, start[, end]]) 返回 sub 在字符串里边出现的次数,start 和 end 参数表示范围,可选。
encode(encoding='utf-8', errors='strict') 以 encoding 指定的编码格式对字符串进行编码。
endswith(sub[, start[, end]]) 检查字符串是否以 sub 子字符串结束,如果是返回 True,否则返回 False。start 和 end 参数表示范围,可选。
expandtabs([tabsize=8]) 把字符串中的 tab 符号(\t)转换为空格,如不指定参数,默认的空格数是 tabsize=8。
find(sub[, start[, end]]) 检测 sub 是否包含在字符串中,如果有则返回索引值,否则返回 -1,start 和 end 参数表示范围,可选。
index(sub[, start[, end]]) 跟 find 方法一样,不过如果 sub 不在 string 中会产生一个异常。
isalnum() 如果字符串至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False。
isalpha() 如果字符串至少有一个字符并且所有字符都是字母则返回 True,否则返回 False。
isdecimal() 如果字符串只包含十进制数字则返回 True,否则返回 False。
isdigit() 如果字符串只包含数字则返回 True,否则返回 False。
islower() 如果字符串中至少包含一个区分大小写的字符,并且这些字符都是小写,则返回 True,否则返回 False。
isnumeric() 如果字符串中只包含数字字符,则返回 True,否则返回 False。
isspace() 如果字符串中只包含空格,则返回 True,否则返回 False。
istitle() 如果字符串是标题化(所有的单词都是以大写开始,其余字母均小写),则返回 True,否则返回 False。
isupper() 如果字符串中至少包含一个区分大小写的字符,并且这些字符都是大写,则返回 True,否则返回 False。
join(sub) 以字符串作为分隔符,插入到 sub 中所有的字符之间。
ljust(width) 返回一个左对齐的字符串,并使用空格填充至长度为 width 的新字符串。
lower() 转换字符串中所有大写字符为小写。
lstrip() 去掉字符串左边的所有空白符
partition(sub) 找到子字符串 sub,把字符串分成一个 3 元组 (pre_sub, sub, fol_sub),如果字符串中不包含 sub 则返回 ('原字符串', '', '')
replace(old, new[, count]) 把字符串中的 old 子字符串替换成 new 子字符串,如果 count 指定,则替换不超过 count 次。
rfind(sub[, start[, end]]) 类似于 find() 方法,不过是从右边开始查找。
rindex(sub[, start[, end]]) 类似于 index() 方法,不过是从右边开始。
rjust(width) 返回一个右对齐的字符串,并使用空格填充至长度为 width 的新字符串。
rpartition(sub) 类似于 partition() 方法,不过是从右边开始查找。
rstrip() 删除字符串末尾的空白符。
split(sep=None, maxsplit=-1) 不带参数默认是以空格为分隔符切片字符串,如果 maxsplit 参数有设置,则仅分隔 maxsplit 个子字符串,返回切片后的子字符串拼接的列表。
splitlines(([keepends])) 按照'\n'分割,返回一个包含各行元素的列表。如果keepends参数指定,这返回前keepends行
startswith(prefix[, start[, end]]) 检查字符串是否以 prefix 开头,是则返回 True,否则返回 False。start 和 end 参数可以指定范围检查,可选。
strip([chars]) 删除字符串前边和后边所有的空白符(包括\n、\r、\t、' ',即:换行、回车、制表符、空格),chars 参数可以定制删除的字符,可选。
swapcase() 翻转字符串中的大小写。
title() 返回标题化(所有的单词都是以大写开始,其余字母均小写)的字符串。
translate(table) 根据 table 的规则(可以由 str.maketrans('a', 'b') 定制)转换字符串中的字符。
upper() 转换字符串中的所有小写字符为大写。
zfill(width) 返回长度为 width 的字符串,原字符串右对齐,前边用 0 填充。

参考资料:字符串的方法及注释

这么多BIF背过是不可能的。。。就用的时候现查吧,或许用的多了就熟悉了,用法也都蛮简单的,几个不太清楚的举个例子

join()

调用格式为str.join(sub),其中str和sub都是字符串,输出结果是将str插入到sub中。

>>> test = '^0^'
>>> test.join('Python')
'P^0^y^0^t^0^h^0^o^0^n'

split()

对字符串进行切片并转换成列表,默认以空格进行分割,若有输入参数则按该参数进行分割,maxsplit表示最大切割次数。

>>> test = 'I love Python'

>>> test.split()
['I', 'love', 'Python']

>>> test.split('o')
['I l', 've Pyth', 'n']

>>> test.split(maxsplit=1)
['I', 'love Python']

translate()

该函数的输入参数是一个转换表table,table可用函数str.maketrans(intab,outtab)生成,其中intab和outtab必须是长度相同的字符串。例如

>>> test = 'I love Python'
>>> table = str.maketrans('Ithon', '12345')
>>> test.translate(table)
'1 l4ve Py2345'

往期回顾

Python学习笔记(0)之Hello,python!
Python学习笔记(1)之列表list
Python学习笔记(2)之元组、字典&集合

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

推荐阅读更多精彩内容