字符串进阶

一、字符串相关方法

  • 字符串拼接
    1.字符串.join(序列) - 将序列中的元素用指定的字符串拼接在一起,形成一个新的
    字符串。(序列中的元素必须是字符串)
# 举例
list1 = ['后羿', '王昭君', '鲁班七号', '孙悟空']
result = ''.join(list1)
print(result)    # '后羿王昭君鲁班七号孙悟空'

result = '+'.join(list1)
print(result)    # '后羿+王昭君+鲁班七号+孙悟空'

result = 'and'.join(list1)
print(result)    # '后羿and王昭君and鲁班七号and孙悟空'

result = '*'.join('abc')
print(result)    # a*b*c

2.如果需要join的序列中的元素不是字符串,就想办法把它的元素变成字符串再join

nums = [223,45,67, 89, 45]
result = ''.join([str(i) for i in nums])
print(result)    # '22345678945'
  • 切割
    1.字符串1.split(字符串2) - 将字符串1中所有的字符串2作为切割点对字符串进
    行切割,返回包含切割后每一小段对应的字符串的列表。切割点会消失。
str1 = 'abcmn123mnkplmn##'
result = str1.split('mn')
print(result)    # ['abc', '123', 'kpl', '##']

2.字符串1.split(字符串2,N) - 将字符串1中前N个字符串2作为切割点为字符串1进行切割

str1 = 'abcmn123mnkplmn##'
result = str1.split('mn', 2)
print(result)    # ['abc', '123', 'kpl##']
  • 替换
    1.字符串1.replace(字符串2, 字符串3) - 将字符串1中所有的字符串2替换成
    字符串3
str1 = 'mnabcmnmn123mnkpl##mn'
result = str1.replace('mn', 'ABC')
print(result)    # ABCabcABCABC123ABCkpl##ABC

2.字符串1.replace(字符串2, 字符串3, N) - 将字符串1中前N个字符串2替换

成字符串3

str1 = 'mnabcmnmn123mnkpl##mn'
result = str1.replace('mn', 'AB', 3)
print(result)    # ABabcABAB123mnkpl##mn
  • 删除空白字符
    1.字符串.strip() - 删除字符串左右两端的空白字符
    2.字符串.rstrip() - 删除字符串右端的空白字符
    3.字符串.lstrip() - 删除字符串左端的空白字符
str1 = '\n\t      小 明\n\t'
print(str1)
print('==============华丽的分割线===============')
result = str1.strip()     
print(result)    # 小 明
  • find、index
    1.字符串1.find(字符串2) - 获取字符串1中字符串2第一次出现的位置(以0
    开始的下标值返回),如果字符串2不存在返回-1。
    2.字符串1.find(字符串2,开始下标,结束下标) - 获取字符串1中指定范围内
    字符串2第一次出现的位置(以0开始的下标值返回-1)。
    3.字符串1.index(字符串2) - 获取字符串1中字符串2第一次出现的位置(以
    0开始的下标值返回),如果字符串2不存在报错。
    4.字符串1.index(字符串2,开始下标,结束下标) - 获取字符串1中字符串2第
    一次出现的位置(以0开始的下标值返回),如果字符串2不存在报错。
str1 = 'how are you? I am fine, thank you! and you?'
print(str1.find('you'))    # 8
print(str1.index('you'))    # 8

print(str1.find('abc'))    # -1,表示没有找到
# print(str1.index('abc'))    # 报错!substring not found

print(str1.find('you', 10))    # 30
print(str1.find('you', 10, 26))    # -1
  • 其他方法
    1.casefold()
print('abcMN123'.casefold())    # abcmn123

2.center、rjust、ljust、zfill -------

‘abc’ -> ‘xxabcxx’,‘xxxxabc’, ‘abcxxxx’, ‘0000abc’

str1 = 'abc'
print(str1.center(7, '+'))    # ++abc++
print(str1.ljust(7, '*'))    # abc****
print(str1.rjust(7, '&'))    # &&&&abc
print(str1.zfill(7))    # 0000abc

3.count - 统计字符串中xx出现的的次数

str1 = 'mnabcmnmn123mnkpl##mn'
print(str1.count('a'))    # 1
print(str1.count('mn'))    # 5

4.endswith、startswith

str1 = 'mnabcmnmn123mnkpl##mn'
print(str1.endswith('abc'))    # False
print(str1.endswith('#mn'))    # True

print(str1.startswith('ab'))    # False
print(str1.startswith('mn'))    # True

5.format、f ---- 格式化

name = '小明'
age = 18
# 'xxx今年xx岁!'
result = str.format('{}今年{}岁', name, age)
print(result)    # 小明今年18岁

result = f'{name}今年{age}岁'
print(result)    # 小明今年18岁

6.isdecimal、isdigit、isnumeric 、islower(全是小写字母)

print('2323'.isdecimal())    # True
print('323a3'.isdecimal())    # False
print('2323--'.isdecimal())    # False
print('==============华丽的分割线===============')
print('232311'.isdigit())    # True
print('2323+11'.isdigit())    # False
print('2323--'.isdigit())    # False
print('==============华丽的分割线===============')
print('2323'.isnumeric())    # True
print('232a3'.isnumeric())    # False
print('2323--'.isnumeric())    # False

print('hgaj'.islower())   # True
print('x'.islower())     # True

案例:

# 输出字符串里所有数字
str1 = '722实际上飞机22-2233=+集合289'
for i in str1:
    if i.isdigit():
        print(i)

7.maketrans、translate - 根据映射表对应的关系替换字符串中的相关

字符

str1 = '1727283112shanshuo2nsnk2'
# 创建一个映射表
table = str.maketrans('1234567890', '一二三四五六七八九零')
# 根据映射表对应的关系替换字符串中的相关字符
result = str1.translate(table)
print(result)    # 一七二七二八三一一二shanshuo二nsnk二

# 案例
# 星期一
str1 ='星期1, 星期2, 星期3,星期4, 星期5, 星期6, 星期7'
table = str.maketrans('1234567','一二三四五六天')
result = str1.translate(table)
print(result)    # 星期一, 星期二, 星期三,星期四, 星期五, 星期六, 星期天

二、字符串格式化

解决字符串内容变化

  • 字符串拼接
name = '小明'
age = 18
message = name + '今年' + str(age) + '岁!'
print(message)    # 小明今年18岁!
  • 格式字符串
    1.语法:包含一个或者多个格式占位符的字符串 % (数据1,数据2,数据3,…)
    2.说明:()中的数据必须和前面字符串中的占位符一一对应,如果只需要
    一个数据,那么()可以省略
    3.常用的字符串占位符:
    %s - 可以给任何类型的数据占位(字符串占位符)
    %d - 只能给数字数据占位(整数占位符)
    %f - 只能给数字数据占位(浮点数占位符,默认保留6位小数)
    %.Nf - 只能给数字数据占位(保留N位小数)
name = '小明'
age = 18
message = '%s今年%d岁!' % (name, age)
print(message)    # 小明今年18岁!

result = '%s%s%s' % ('abc', 12, [10, 20])
print(result)    # abc12[10, 20]

result = '%d-%d' % (12, 2)
print(result)    # 12-2

result = '%f-%f' % (2.3, 34)
print(result)    # 2.300000-34.000000

result = '%.2f-%.1f' % (2.3, 34)
print(result)    # 2.30-34.0
  • f-string
    f-string的参数:{提供数据的表达式: 参数}
name = '小明'
age = 18
money = 15000

str1 = '姓名:{name}, 年龄:{age}'
print(str1)   # 姓名:{name}, 年龄:{age}

str2 = f'姓名:{name}, 年龄:{age}'
print(str2)   # 姓名:小明, 年龄:18

str3 = f'a:{age}, b:{100}, c{100*2}, d:{100>200}, c: {name*2}, d:{name[-1]}'
print(str3)

1.控制小数位数: {提供数据的表达式: .Nf}

money = 672828279
result = f'余额:{money:.2f}元'
print(result)    # 余额:672828279.00元

num = 102.3447
result = f'个数:{num:.0f}'
print(result)    # 个数:102

money = 16500
result = f'年薪:{money*13:.2f}元'
print(result)    # 年薪:214500.00元

2.大金额逗号分割: {提供数据的表达式:,}

money = 165009000
result = f'金额:{money:,}元'
print(result)    # 金额:165,009,000元

# {提供数据的表达式:,.Nf}  -  既控制小数位数,又使用逗号
result = f'金额:{money:,.2f}元'
print(result)    # 金额:165,009,000.00元

3.小数显示成百分比:{提供数据的表达式:,.N%}

scale = 0.34
result = f'及格率:{scale:.1%}'
print(result)    # 及格率:34.0%

4.控制填充长度(实现center、rjust、ljust、zfill的功能):

{提供数据的表达式:字符^长度}、{提供数据的表达式:字符>长度}、

{提供数据的表达式:字符<长度}、 如果没有其他字符,会用空格填充

num = 6
result = f'{num:0>3}'
print(result)   # 006

result = f'{num:x>7}'
print(result)    # xxxxxx6

result = f'{num:x<7}'
print(result)    # 6xxxxxx

result = f'{num:x^7}'
print(result)    # xxx6xxx

result = f'编号:{num:>7}'
print(result)    # 编号:      6

nums = [155, 1, 92, 9, 23, 899,  18, 5821, 47, 8993]
for i in nums:
    print(f'{i:>4}')