课时14:字符串:各种奇葩的内置方法

目录:

  一、字符串的秘密

  二、各种内置方法

  三、课时14课后习题及答案

*********************

一、字符串的秘密

*********************

 学习了列表和元组,我们知道了分片的概念,事实上也可以应用于字符串上:

>>> str1 = "I love zww"
>>> str1[:6]
'I love'

在python中没有字符这个类型,在Python看来,所谓字符,就是长度为1的字符串。当要访问字符串的其中一个字符的时候,只需要索引列表或元组的方法来索引字符串即可:

>>> str1[5]
'e'

字符串和元组一样,都是属于”一言既出、驷马难追”的家伙。所以一旦定下来就不能直接对它们进行修改了,如果必须修改,我们就需要委曲求全…

>>> str1[:6]+"插入的字符串"+str1[6:]
'I love插入的字符串 zww'

*********************

二、各种内置方法

*********************

 下面的表总结了字符串的所以方法及对应的含义。

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

 这里选几个常用的给大家演示一下用法,首先是casefold(),它的作用是把整个字符串的所有字符改为小写:

>>> str1 ="Love"
>>> str1.casefold()
'love'

count(sub[, start[, end]])          其作用是返回 sub 在字符串里边出现的次数,start 和 end 参数表示范围,可选。注:在python文档中,用方括号扣起来的表示可选。

>>> str1 = "AbcABCabCabcABCabc"
>>> str1.count('ab',0,15)
2

如果你要查找某个字符串在该字符串中的位置,可使用find(sub[, start[, end]])或者index(sub[, start[, end]])方法。如果找到了,则返回值是第一个字符的索引值;如果找不到,则find()方法会返回-1,index()方法会抛出异常。(注:异常是可以被捕获并处理的错误,目前你可以认为就是错误)

>>> str1 = "I love zww"
>>> str1.find("zww")
7
>>> str1.find("good")
-1
>>> str1.index("zww")
7
>>> str1.index("good")
Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    str1.index("good")
ValueError: substring not found

程序员很喜欢用join(sub)来连接字符串,但它的用法也许会让你感到诧异。join是以字符串作为分隔符,插入到sub字符串中所有的字符之间:

>>> 'x'.join("Test")
'Txexsxt'
>>> '_'.join("FishC")
'F_i_s_h_C'

为什么说“程序员喜欢用 join()来连接字符串”,我们不是有很好用的连接符号(+)吗?这是因为当使用连接符号(+)去拼接大量的字符串时是非常低效的,因为加号会引起内存复制以及垃圾回收操作。所以对于大量的字符串拼接来说,使用join()方法的效率会高一些。

>>> 'I' + ' ' + 'love' + ' '+'fishc.com'
'I love fishc.com'
>>> ' '.join(['I','love','fishc.com'])
'I love fishc.com'

replace(old, new[, count]) 方法如其名,就是替换指定的字符串:

>>> str1 ="I love you"
>>> str1.replace("you","fishc.com")
'I love fishc.com'

split(sep=None, maxsplit=-1)跟join()正好相反,split()用于拆分字符串:

>>> str1 = ' '.join(['I','love','fishc.com'])
>>> str1
'I love fishc.com'
>>> str1.split()
['I', 'love', 'fishc.com']
>>> str2 = '_'.join("FishC")
>>> str2
'F_i_s_h_C'
>>> str2.split(sep='_')
['F', 'i', 's', 'h', 'C']
>>> str1 = 'jninann g'
>>> str1.split()
['j', 'i', 'a', 'n', 'g']
>>> str1 = 'jninanntg'
>>> str1.split()
['j', 'i', 'a', 'n', 'g']
>>> str1 = 'jninanng'
>>> str1.split()
['j', 'i', 'a', 'ng']

*******************************

三、课时14课后习题及答案

********************************

测试题:
  
0. 还记得如何定义一个跨越多行的字符串吗(请至少写出两种实现的方法)?

方法一:
   
>>> str1 = '''待我长发及腰,将军归来可好?
此身君子意逍遥,怎料山河萧萧。
天光乍破遇,暮雪白头老。
寒剑默听奔雷,长枪独守空壕。
醉卧沙场君莫笑,一夜吹彻画角。
江南晚来客,红绳结发梢。'''
   
方法二:
   
>>> str2 = '待卿长发及腰,我必凯旋回朝。
昔日纵马任逍遥,俱是少年英豪。
东都霞色好,西湖烟波渺。
执枪血战八方,誓守山河多娇。
应有得胜归来日,与卿共度良宵。
盼携手终老,愿与子同袍。'
   
方法三:
   
>>> str3 = ('待卿长发及腰,我必凯旋回朝。'
'昔日纵马任逍遥,俱是少年英豪。'
'东都霞色好,西湖烟波渺。'
'执枪血战八方,誓守山河多娇。'
'应有得胜归来日,与卿共度良宵。'
'盼携手终老,愿与子同袍。')

1. 三引号字符串通常我们用于做什么使用?

三引号字符串不赋值的情况下,通常当作跨行注释使用,例如:

'''这是一个三引号字符串用于注释的例子,
例子虽然只是简简单单的一句话,
却毫无遮掩地体现了作者用情至深,
所谓爱至深处情至简!'''

print("I love FishC.com!")

2. file1 = open(‘C:windowstempreadme.txt’, ‘r’) 表示以只读方式打开“C:windowstempreadme.txt”这个文本文件,但事实上这个语句会报错,知道为什么吗?你会如何修改?

会报错是因为在字符串中,我们约定“t”和“r”分别表示“横向制表符(TAB)”和“回车符”(详见:http://bbs.fishc.com/thread-39140-1-1.html),因此并不会按照我们计划的路径去打开文件。
Python 为我们铺好了解决的道路,只需要使用原始字符串操作符(R或r)即可:

>>> str1 = 'C:windowstempreadme.txt'
>>> print(str1)
C:windowstempreadme.txt

>>> str1 = r'C:windowstempreadme.txt'
>>> str1
'C:windowstempreadme.txt'
>>> print(str1)
C:windowstempreadme.txt

Python转义字符

在需要在字符中使用特殊字符时,python用反斜杠()转义字符。如下表:

转义字符 描述
(在行尾时) 续行符
反斜杠符号
单引号
双引号
a 响铃
b 退格(Backspace)
e 转义
00
n 换行
v 纵向制表符
t 横向制表符
r 回车
f 换页
oyy 八进制数,yy代表的字符,例如:o12代表换行
xyy 十六进制数,yy代表的字符,例如:x0a代表换行
other 其它的字符以普通格式输出

3. 有字符串:str1 = ‘<a href=”http://www.fishc.com/dvd” target=”_blank”>鱼C资源打包</a>’,请问如何提取出子字符串:’www.fishc.com’   

>>> str1[str1.find('//'):str1.find('/dvd')]
'//www.fishc.com'
>>> str1[(str1.find('//')+2):str1.find('/dvd')]
'www.fishc.com'

小甲鱼:
>>> str1[16:29]

4. 如果使用负数作为索引值进行分片操作,按照第三题的要求你能够正确目测出结果吗?

>>> str1[-45:-32]
'www.fishc.com'

5. 还是第三题那个字符串,请问下边语句会显示什么内容?

>>> str1[20:-36]
>>> str1[20:-36]
'fishc'

6. 据说只有智商高于150的鱼油才能解开这个字符串(还原为有意义的字符串):str1 = ‘i2sl54ovvvb4e3bferi32s56h;$c43.sfc67o0cm99’

>>> str1[::3]
'ilovefishc.com'

动动手:

0. 请写一个密码安全性检查的脚本代码:check.py

# 密码安全性检查代码
#
# 低级密码要求:
#   1. 密码由单纯的数字或字母组成
#   2. 密码长度小于等于8位
#
# 中级密码要求:
#   1. 密码必须由数字、字母或特殊字符(仅限:~!@#%^&*()_=-/,.?<>;:[]{}|)任意两种组合
#   2. 密码长度不能低于8位
#
# 高级密码要求:
#   1. 密码必须由数字、字母及特殊字符(仅限:~!@#%^&*()_=-/,.?<>;:[]{}|)三种组合
#   2. 密码只能由字母开头
#   3. 密码长度不能低于16位

程序演示:

请输入密码:
请重新输入密码:erer
低级密码

请输入密码:ewrwer435345
中级密码

请输入密码:Adsfsdfdsf45654645&&&&&&
高级密码

Special_Characters = r"~!@#$%^&*()_=-/,.?<>;:[]{}|"""

password = input('请输入密码:')
length = len(password)
while (password.isspace() or length == 0):
password = input('请重新输入密码:')
length = len(password)

Ct_Spe_Char = False
for
character in Special_Characters:
if (character in password):
Ct_Spe_Char = True

Ct_Letter = False
Ct_Number = False
for
passwd in password:
if passwd.isalpha():
Ct_Letter = True
elif
passwd.isdigit():
Ct_Number = True

Char_Check = Ct_Spe_Char + Ct_Letter + Ct_Number

if password.isalnum() and (length <= 8):
print('低级密码')
elif (Char_Check >= 2) and (8 <= length < 16):
print('中级密码')
elif password[0].isupper() and (Char_Check == 3) and (length >= 16):
print('高级密码')
else:
print('没有匹配')
小甲鱼:
 symbols = r'''`!@#$%^&*()_+-=/*{}[]|'";:/?,.<>'''
 chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
 nums = '0123456789'
 
 passwd = input('请输入需要检查的密码组合:')
 
 # 判断长度
 length = len(passwd)
 
 while (passwd.isspace() or length == 0) :
     passwd = input("您输入的密码为空(或空格),请重新输入:")
 
 if length <= 8:
     flag_len = 1
 elif 8 < length < 16:
     flag_len = 2
 else:
     flag_len = 3
 
 flag_con = 0
 
 # 判断是否包含特殊字符
 for each in passwd:
     if each in symbols:
         flag_con += 1
         break
     
 # 判断是否包含字母
 for each in passwd:
     if each in chars:
         flag_con += 1
         break
 
 # 判断是否包含数字
 for each in passwd:
     if each in nums:
         flag_con += 1
         break    
 
 # 打印结果
 while 1 :
     print("您的密码安全级别评定为:", end='')
     if flag_len == 1 or flag_con == 1 :
         print("低")
     elif flag_len == 2 or flag_con == 2 :
         print("中")
     else :
         print("高")
         print("请继续保持")
         break
 
     print("请按以下方式提升您的密码安全级别:n
     t1. 密码必须由数字、字母及特殊字符三种组合n
     t2. 密码只能由字母开头n
     t3. 密码长度不能低于16位'")
     break

发表回复