Python第九次课
一、字符串的常用方法
Python字符串支持与整数的乘法运算,表示序列重复,也就是字符串内容的重复,得到新字符串。
>>> 'abcd' * 3
'abcdabcdabcd'
1.s.startswith(t)、s.endswith(t),判断字符串是否以指定字符串开始或结束
>>> s = 'Beautiful is better than ugly.'
>>> s.startswith('Be') #检测整个字符串
True
>>> s.startswith('Be', 5) #指定检测范围起始位置
False
>>> s.startswith('Be', 0, 5) #指定检测范围起始和结束位置
True
2.isalnum()、isalpha()、isdigit()、isdecimal()、isnumeric()、isspace()、isupper()、islower(),用来测试字符串是否为数字或字母、是否为字母、是否为数字字符、是否为空白字符、是否为大写字母以及是否为小写字母。
>>> '1234abcd'.isalnum()
True
>>> '1234abcd'.isalpha() #全部为英文字母时返回True
False
>>> '1234abcd'.isdigit() #全部为数字时返回True
False
>>> 'abcd'.isalpha()
True
>>> '1234.0'.isdigit()
False
3.除了字符串对象提供的方法以外,很多Python内置函数也可以对字符串进行操作。
例子演示:
>>> x = 'Hello world.'
>>> len(x) #字符串长度
12
>>> max(x) #最大字符
'w'
>>> min(x)
' '
>>> list(zip(x,x)) #zip()也可以作用于字符串
[('H', 'H'), ('e', 'e'), ('l', 'l'), ('l', 'l'), ('o', 'o'), (' ', ' '), ('w', 'w'), ('o', 'o'), ('r', 'r'), ('l', 'l'), ('d', 'd'), ('.', '.')]
>>> max(['abc', 'ABD'], key=str.upper) #忽略大小写
'ABD'
4.切片也适用于字符串,但仅限于读取其中的元素,不支持字符串修改。
>>> 'Explicit is better than implicit.'[:8]
结果:'Explicit'
>>> 'Explicit is better than implicit.'[9:23]
结果:'is better than'
二、字符串常量
1.Python标准库string中定义数字字符、标点符号、英文字母、大写字母、小写字母等常量。Python标准库string中定义数字字符、标点符号、英文字母、大写字母、小写字母等常量。
>>> import string
>>> string.digits
'0123456789'
>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.ascii_lowercase
'abcdefghijklmnopqrstuvwxyz'
>>> string.ascii_uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
应用例子:随机密码的生成
>>> import string
>>> characters = string.digits + string.ascii_letters
>>> import random
>>> ''.join([random.choice(characters) for i in range(8)])
'J5Cuofhy'
>>> ''.join([random.choice(characters) for i in range(10)])
'RkHA3K3tNl'
>>> ''.join([random.choice(characters) for i in range(16)])
'zSabpGltJ0X4CCjh'
三、可变字符串
在Python中,字符串属于不可变对象,不支持原地修改,如果需要修改其中的值,只能重新创建一个新的字符串对象。然而,如果确实需要一个支持原地修改的unicode数据对象,可以使用io.StringIO对象或array模块。
>>> import io
>>> s = "Hello, world"
>>> sio = io.StringIO(s)
>>> sio.getvalue()
'Hello, world'
>>> sio.seek(7)
7
>>> sio.write("there!")
6
四、字符串经典案例
例子:1.检查并判断密码字符串的安全强度。
import string
def check(pwd):
#密码必须至少包含6个字符
if not isinstance(pwd, str) or len(pwd)<6:
return 'not suitable for password'
#密码强度等级与包含字符种类的对应关系
d = {1:'weak', 2:'below middle', 3:'above middle', 4:'strong'}
#分别用来标记pwd是否含有数字、小写字母、大写字母和指定的标点符号
r = [False] * 4
for ch in pwd:
#是否包含数字
if not r[0] and ch in string.digits:
r[0] = True
#是否包含小写字母
elif not r[1] and ch in string.ascii_lowercase:
r[1] = True
#是否包含大写字母
elif not r[2] and ch in string.ascii_uppercase:
r[2] = True
#是否包含指定的标点符号
elif not r[3] and ch in ',.!;?<>':
r[3] = True
#统计包含的字符种类,返回密码强度
return d.get(r.count(True), 'error')
print(check('a2Cd,'))
2.编写程序,把一个英文句子中的单词倒置,标点符号不倒置,例如 I like beijing. 经过函数后变为:beijing. like I
def rev1(s):
return ' '.join(reversed(s.split()))
def rev2(s):
t = s.split()
t.reverse()
return ' '.join(t)
def rev5(s):
'''字符串整体逆序,分隔,再各单词逆序'''
t = ''.join(reversed(s)).split()
t = map(lambda x:''.join(reversed(x)), t)
return ' '.join(t)
3.编写程序,查找一个字符串中最长的数字子串。
def longest(s):
result = []
t = []
for ch in s: # 遍历字符串中所有字符
if '0'<=ch<='9': # 遇到数字,记录到临时变量
t.append(ch)
elif t:
result.append(''.join(t)) #遇到非数字,把临时的连续数字记下来
t = []
if t: # 考虑原字符串以数字结束的情况
result.append(''.join(t))
if result:
return max(result, key=len)
return 'No'
方法二:选择法
def longest(s):
length = len(s)
start = 0
span = (0, 0)
for pos in range(length):
if s[pos].isdigit() and (pos==0 or not s[pos-1].isdigit()):
start = pos
elif ((not s[pos].isdigit()) and s[pos-1].isdigit()
and pos-start>span[1]-span[0]):
span = (start, pos-1)
#字符串以数字结束的情况
if s[pos].isdigit() and pos-start>=span[1]-span[0]:
span = (start, pos)
return s[span[0]:span[1]+1]
ss = ('111abc2d3', 'abc111111d', 'a2bc11111111')
for s in ss:
print(s, longest(s), sep=':')
五、总结
最后的惯例