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 |
注:
- Python中百分号格式化是不存在自动将整数转换成二进制表示的方式
- 当字符串中存在格式化标志%时,需要用 %%表示一个百分号
>>> '%(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!'
注:
- 位置参数和关键字参数可以同时存在,但
.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!'
- 可用列表及对应索引值改进位置参数
>>> list1 = ['Python' , 'friend']
>>> '{0[0]} is my best {0[1]}'.format(list1)
'Python is my best friend'
- 可用字典(映射)改进关键字参数,需在字典前加
**
>>> dict1=dict(name='Python',relation='friend')
>>> '{name} is my best {relation}'.format(**dict1)
'Python is my best friend'
3.2.3 格式限定符
语法是在{}
中带:
常用的操作符有
-
^
、<
、>
分别是居中、左对齐、右对齐。前面与冒号之间只能是一个字符,表示用于填充的符号;后面跟最小宽度。
>>> '{:>8}'.format(17)
' 17'
>>> '{:a<8}'.format(17)
'17aaaaaa'
>>> '{:.^7}'.format(17)
'..17...'
- 格式化浮点数时可用
m.nf
的形式,m为最小宽度,n为精度。
>>> '{:K^9.3f}'.format(17.1)
'K17.100KK'
- 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'
- 用
,
号还能用来做金额的千位分隔符
>>> '{:,}'.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)之元组、字典&集合