《零基础入门学习Python》(14)--字符串:各种奇葩的内置方法

前言

这节课我们回过头来,再谈一下字符串,或许我们现在再来谈字符串,有些朋友可能觉得没必要了,甚至有些朋友就会觉得,不就是字符串吗,哥闭着眼也能写出来,那其实关于字符串还有很多你不知道的秘密哦。由于字符串在日常生活中是如此的常见,因此小甲鱼抱着负责任的态度,在这节课上,把所有知道的东西都倒出来跟大家分享下。 

无论说你是之前学过了也好,再怎么熟悉也好,因为我们字符串有非常多的方法,而且很多方法都是比较奇葩的,而且这些方法在Python2.x 与Python3.x中都略有差别。,所以大家可以把这节课当作一次复习。

我们学习的列表和元组,都支持分片操作,事实上我们的字符串也是支持的,列如:

>>> str1 = 'i love fishc.com'
>>> 
>>> str1[:6]
'i love'

知识点 

下面谈一下python各种奇葩的字符串内置方法

capitalize()

把字符串的第一个字符改为大写

>>> str2 = 'xiaoxie'
>>>str2.capitalize() 
'Xiaoxie'
casefold() 把整个字符串的所有字符改为小写
>>> str2 = 'XiAoXie'
>>> str2.casefold()
'xiaoxie'
center(width) 将字符串居中,并使用空格填充至长度 width 的新字符串
>>> str2 = 'ju Zhong'
>>> str2.center(18) 
' ju Zhong '
count(sub[, start[, end]]) 返回 sub 在字符串里边出现的次数,start 和 end 参数表示范围,可选。
>>> str2 = 'fswfff'
>>> str2.count('f') 
4
>>> str2.count('f',3,5)
2
encode(encoding='utf-8', errors='strict') 以 encoding 指定的编码格式对字符串进行编码。
>>> str ='编码'
>>> str_utf8 = str.encode('UTF8')
>>> str_gbk = str.encode('GBK')
>>> print(str)
编码
>>> print(str_utf8)
b'\xe7\xbc\x96\xe7\xa0\x81'
>>> print(str_gbk)
b'\xb1\xe0\xc2\xeb'
>>> print(str_utf8.decode('utf8'))
编码
>>> print(str_gbk.decode('gbk'))
编码
endswith(sub[, start[, end]])

检查字符串是否以 sub 子字符串结束,如果是返回 True,否则返回 False。start 和 end 参数表示范围,可选。

>>> str2 = '我爱你我'
>>> str2.endswith('我')
True
>>> str2.endswith('我',1,3)
False
>>> str2.endswith('我',1,4)
Tru
expandtabs([tabsize=8]) 把字符串中的 tab 符号(\t)转换为空格,如不指定参数,默认的空格数是 tabsize=8。
>>> str2 = 'geck f'
>>> str2.expandtabs()
'geck f'
>>> temp = len(str2.expandtabs())
>>> temp
9
>>> len(str2)
6
>>> str2.expandtabs(40)
'geck f'
>>> len(str2.expandtabs(40))
41
find(sub[, start[, end]]) 检测 sub 是否包含在字符串中,如果有则返回索引值,否则返回 -1,start 和 end 参数表示范围,可选。
>>> str2 = '感谢小甲鱼'
>>> str2.find('小')
2
>>> str2.find('小',3,5)
-1
index(sub[, start[, end]]) 跟 find 方法一样,不过如果 sub 不在 string 中会产生一个异常。
>>> str2.index('小')
2
>>> str2.index('小m')
Traceback (most recent call last):
File "<pyshell#68>", line 1, in <module>
str2.index('小m')
ValueError: substring not found
isalnum() 如果字符串至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False。
`>>> str2 = 'fsaa'
>>> str2.isalnum()
True
>>> str2 = 'fs1'
>>> str2.isalnum()
True
>>> str2 = '1.3'
>>> str2.isalnum()
False
>>> str2 = ' '
>>> str2.isalnum()
False
>>> str2 = '+'
>>> str2.isalnum()
False
isalpha() 如果字符串至少有一个字符并且所有字符都是字母则返回 True,否则返回 False。
>>> str2 = 'fsfs'
>>> str2.isalpha()
True
isdecimal() 如果字符串只包含十进制数字则返回 True,否则返回 False。
>>> str2 = '123456'
>>> str2.isdecimal()
True
>>> str2 = '123456f'
>>> str2.isdecimal()
False
>>> str2 = '123.456'
>>> str2.isdecimal()
False
isdigit() 如果字符串只包含数字则返回 True,否则返回 False。
>>> str2 = '111111'
>>> str2.isdigit()
True
islower() 如果字符串中至少包含一个区分大小写的字符,并且这些字符都是小写,则返回 True,否则返回 False。
>>> str2 = '12fsfs'
>>> str2.islower()
True
isnumeric() 如果字符串中只包含数字字符,则返回 True,否则返回 False。
>>> str2 = '13Ⅳ'
>>> str2.isnumeric()
True
>>> str2 = '四'
>>> str2.isnumeric()
True
isspace() 如果字符串中只包含空格,则返回 True,否则返回 False。
>>> str2 = 'xiaoxie'
>>> str2.xxx 
>>> str2 = ' '
>>> str2.isspace()
True
istitle() 如果字符串是标题化(所有的单词都是以大写开始,其余字母均小写),则返回 True,否则返回 False。
>>> str2 = 'xiaoxie'
>>> str2 = 'Feng Zhong'
>>> str2.istitle()
True
isupper() 如果字符串中至少包含一个区分大小写的字符,并且这些字符都是大写,则返回 True,否则返回 False。
>>> str2 = '1F'
>>> str2.isupper()
True
>>> str2 = '1Fs'
>>> str2.isupper()
False
join(sub) 以字符串作为分隔符,插入到 sub 中所有的字符之间。
>>> str2 = '小甲鱼'
>>> str2.join('12345')
'1小甲鱼2小甲鱼3小甲鱼4小甲鱼5'
ljust(width) 返回一个左对齐的字符串,并使用空格填充至长度为 width 的新字符串。
lower() 转换字符串中所有大写字符为小写。
>>> str2 = 'FFSA小甲鱼11'
>>> str2.lower()
'ffsa小甲鱼11'
lstrip()

去掉字符串左边的所有空格

>>> str2 = ' f s fs'
>>> str2.lstrip()
'f s fs'
partition(sub) 找到子字符串 sub,把字符串分成一个 3 元组 (pre_sub, sub, fol_sub),如果字符串中不包含 sub 则返回 ('原字符串', '', '')
>>> str2 = 'partition'
>>> str2.partition('pa')
('', 'pa', 'rtition')
>>> str2.partition('ti')
('par', 'ti', 'tion')
>>> str2.partition('fs')
('partition', '', '')
replace(old, new[, count]) 把字符串中的 old 子字符串替换成 new 子字符串,如果 count 指定,则替换不超过 count 次。
>>> str2 = '1f2f3f4f5f'
>>> str2.replace('f','d')
'1d2d3d4d5d'
>>> str2.replace('f','d',2)
'1d2d3f4f5f'
rfind(sub[, start[, end]]) 类似于 find() 方法,不过是从右边开始查找。
>>> str2 ='1a2b3c4d5b'
>>> str2.rfind('b')
9
rindex(sub[, start[, end]]) 类似于 index() 方法,不过是从右边开始。
>>> str2 ='1a2b3c4d5b'
>>> str2.rindex('b')
9
rjust(width) 返回一个右对齐的字符串,并使用空格填充至长度为 width 的新字符串。
rpartition(sub) 类似于 partition() 方法,不过是从右边开始查找。
>>> str2 = 'partition'
>>> str2.rpartition('fs')
('', '', 'partition')
rstrip() 删除字符串末尾的空格。
>>> str2 = ' fsfs '
>>> str2.rstrip()
' fsfs'
split(sep=None, maxsplit=-1) 不带参数默认是以空格为分隔符切片字符串,如果 maxsplit 参数有设置,则仅分隔 maxsplit 个子字符串,返回切片后的子字符串拼接的列表。
>>> str = 'i love fishc'
>>> str.split()
['i', 'love', 'fishc']
>>> str.split('l',2)
['i ', 'ove fishc']
splitlines(([keepends])) 在输出结果里是否去掉换行符,默认为 False,不包含换行符;如果为 True,则保留换行符。。
>> str2 = 'ab c\n\nde fg\rkl\r\n'
>>> str2.splitlines()
['ab c', '', 'de fg', 'kl']
>>> str2.splitlines(False)
['ab c', '', 'de fg', 'kl']
>>> str2.splitlines(True)
['ab c\n', '\n', 'de fg\r', 'kl\r\n']
startswith(prefix[, start[, end]]) 检查字符串是否以 prefix 开头,是则返回 True,否则返回 False。start 和 end 参数可以指定范围检查,可选。
>>> str2 = 'qanfin'
>>> str2.startswith('q')
True
>>> str2.startswith('f',3)
True
strip([chars]) 删除字符串前边和后边所有的空格,chars 参数可以定制删除的字符,可选。
>>> str2 = ' w a n b x i n'
>>> str2.strip()
'w a n b x i n'
>>> str2.strip('n')
' w a n b x i '
>>> str2.strip('w')
' w a n b x i n'
>>> str2.strip(' w')
'a n b x i n'
swapcase() 翻转字符串中的大小写。
>>> str2 = 'fISH lOVE'
>>> str2.swapcase()
'Fish Love'
title() 返回标题化(所有的单词都是以大写开始,其余字母均小写)的字符串。
>>> str2 = 'fish love'
>>> str2.title()
'Fish Love'
translate(table) 根据 table 的规则(可以由 str.maketrans('a', 'b') 定制)转换字符串中的字符。
>>> str2 = 'fsfas12123sfsfsfsf'
>>> str2.translate(str.maketrans('f','b'))
'bsbas12123sbsbsbsb'
upper() 转换字符串中的所有小写字符为大写。
>>> str2 = 'fsfas12123sfsfsfsf'
>>> str2.upper()
'FSFAS12123SFSFSFSF'
zfill(width) 返回长度为 width 的字符串,原字符串右对齐,前边用 0 填充。

课后习题

测试题

  • 如何定义一个跨越多行的字符串吗?(请至少写出两种实现的方法)?
方法一:
>>> str1='''床前明月光,
疑是地上霜,
举头望明月,
低头思故乡。'''

方法二:
>>> str1='床前明月光,\
疑是地上霜,\
举头望明月,\
低头思故乡。'

方法三:
>>> str1=('床前明月光,'
'疑是地上霜,'
'举头望明月,'
'低头思故乡。')
  • 三引号字符串通常我们用于做什么使用?

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

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

print("I love FishC.com!")
================== RESTART: C:/Users/ThinkPad/Desktop/5.py ==================
I love FishC.com!
  • file1 = open('C:\Windows\Temp\readme.txt','r')表示只读方式打开C:\windows\temp\readme.txt这个文本文件,但事实上这个语句会报错,知道为什么吗?你会如何修改?

>>> file1 = open('C:\Windows\Temp\readme.txt','r')
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    file1 = open('C:\Windows\Temp\readme.txt','r')
OSError: [Errno 22] Invalid argument: 'C:\\Windows\\Temp\readme.txt'

会报错是因为在字符串中,我们约定\t\r分别表示横向制表符(TAB)回车符,详见字符串格式化符号含义及转义字符含义,因此并不会按照我们计划的路劲去打开文件。 

Python为我们铺好了解决的道路,只需要使用原始字符串操作符(R或r)即可:

file1 = open(r'C:\Windows\Temp\readme.txt','r')
  • **有字符串:str1 = '<a href="http://www.fishc.com/dvd" target="_blank">鱼C资源打包</a>' 
    ,请问如何提取子字符串:www.fishc.com**

str1[str1.find('www.fishc.com'):str1.find('/dvd')]
'www.fishc.com
  • 如果使用负数作为索引值进行分片操作,按照第三题的要求你能正确目测出结果吗?
>>> str1[-45:-32]
'www.fishc.com'
  • 还是上题的字符串,请问下边语句会显示什么内容?
>>> str1[20:-36]
'fishc'
  • 怎么解开此字符串:str1='i2sl54ovvvb4e3bferi32s56h;$c43.sfc67o0cm99'
>>> str1[::3]
'ilovefishc.com'

动动手

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

密码安全性检查代码

低级密码要求: 

1. 密码由单纯的数字或字母组成 

2. 密码长度小于等于8位

中级密码要求: 

1. 密码必须由数字、字母或特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)任意两种组合 

2. 密码长度不能低于8位

高级密码要求: 

1. 密码必须由数字、字母及特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三种组合 

2. 密码只能由字母开头 

3. 密码长度不能低于16位

symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'

passwd = input('请输入需要检查的密码组合:')

# 判断长度
length = len(passwd)

while (passwd.isspace() or length ==0):
    passwd = input("您输入的密码为空(或空格),请重新输入:")
    length = len(passwd)
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 == 3 and flag_con ==3 and (passwd[0] in chars):
        print("高")
        print("请继续保持")
        break
    else:
        print("中")

    print("请按以下方式提升您的密码安全级别:\n\
    \t1. 密码必须由数字、字母及特殊字符三种组合\n\
    \t2. 密码只能由字母开头\n\
    \t3. 密码长度不能低于16位")
    break


 

猜你喜欢

转载自blog.csdn.net/qq_38721302/article/details/83018975
今日推荐