灿灿灿的第九次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=':')

五、总结

最后的惯例在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值