2-6 字符串

字符串

  • 一个个字符组成的有序的序列,是字符的集合
  • 使用单引号、双引号、三引号引住的字符序列
  • 字符串是不可变对象
  • Python3起,字符串就是Unicode类型

字符串定义 初始化

  • 示例
    s1 = 'string'
    print(s1)#运行结果为:string
    s2 = "string2"
    print(s2)#运行结果为:string2
    s3 = '''this's a "String" '''
    print(s3)#运行结果为:this's a "String" 
    s4 = 'hello \n magedu.com'
    print(s4)
    #运行结果为:
    #hello 
    # magedu.com
    s5 = r"hello \n magedu.com"
    print(s5)#运行结果为:hello \n magedu.com
    s6 = 'c:\windows\nt'
    print(s6)
    #运行结果为:
    #c:\windows
    #t
    s7 = R"c:\windows\nt"
    print(s7)#运行结果为:c:\windows\nt
    s8 = 'c:\window\\nt'
    print(s8)#运行结果为:c:\window\nt
    name = 'tom';age = 20
    print(name,age)#运行结果为:tom 20
    s9 = f'{name},{age}'#3.6支持前缀
    print(s9)#运行结果为:tom,20
    sql = """select *from user where name ='tom'"""
    print(sql)#运行结果为:select *from user where name ='tom'
    

字符串元素访问——下标

  • 字符串支持使用访问索引
    sql = "select *from user where name = 'tom'"
    sql[4]#运行结果为:'c'
    sql[4] = 'o'# 这里会抛出TypeError
    
  • 有序的字符集合,字符序列
    for c in sql :
        print(c)
        print(type(c))
    
    运行结果
    s
    <class 'str'>
    e
    <class 'str'>
    l
    <class 'str'>
    e
    <class 'str'>
    c
    <class 'str'>
    t
    <class 'str'>
     
    <class 'str'>
    *
    <class 'str'>
    f
    <class 'str'>
    r
    <class 'str'>
    o
    <class 'str'>
    m
    <class 'str'>
     
    <class 'str'>
    u
    <class 'str'>
    s
    <class 'str'>
    e
    <class 'str'>
    r
    <class 'str'>
     
    <class 'str'>
    w
    <class 'str'>
    h
    <class 'str'>
    e
    <class 'str'>
    r
    <class 'str'>
    e
    <class 'str'>
     
    <class 'str'>
    n
    <class 'str'>
    a
    <class 'str'>
    m
    <class 'str'>
    e
    <class 'str'>
     
    <class 'str'>
    =
    <class 'str'>
     
    <class 'str'>
    '
    <class 'str'>
    t
    <class 'str'>
    o
    <class 'str'>
    m
    <class 'str'>
    '
    <class 'str'>
    
  • 可迭代
    lst = list(sql)
    lst
    
    运行结果
    ['s',
     'e',
     'l',
     'e',
     'c',
     't',
     ' ',
     '*',
     'f',
     'r',
     'o',
     'm',
     ' ',
     'u',
     's',
     'e',
     'r',
     ' ',
     'w',
     'h',
     'e',
     'r',
     'e',
     ' ',
     'n',
     'a',
     'm',
     'e',
     ' ',
     '=',
     ' ',
     "'",
     't',
     'o',
     'm',
     "'"]
    

字符串join连接

  • “string”.join(iterable) -> str
    • 将可迭代对象连接起来,使用String作为分隔符
    • 可迭代对象本身元素都是字符串
    • 返回一个新字符串
  • 示例
    lst = ['1','2','3']
    print("\"".join(lst))#运行结果为:1"2"3
    print(" ".join(lst))#运行结果为:1 2 3
    print("\n".join(lst))#运行结果为:1 \n2 \n3 
    lst = ['1',['a','b'],'3']
    print(" ".join(lst))#抛出TypeError#解决方法" ".join(map(str,lst))
    

字符串+连接

  • + -> str
    • 将2个字符串连接在一起
    • 返回一个新字符串

字符串分割

  • 分割字符串的方法分为2类
    • split系
      将字符串按照分隔符分割成若干字符串,并立即返回列表(立即表示不是惰性的)
    • partition系
      将字符串按照分隔符分割成2段,返回这2段和分隔符的元组(立即返回一个三元组)(三元组,三个元素的元组)
    • splitlines([keepends]) -> list of strings
      • 按照行来切分字符串
      • keepends指的是是否保留行分隔符
      • 行分隔符包括\n 、\r\n、 \r等
        'ab c\n\nde fg\rkl\r\n'.splitlines()#运行结果为:['ab c', '', 'de fg', 'kl']
        'ab c\n\nde fg\rkl\r\n'.splitlines()#运行结果为:['ab c', '', 'de fg', 'kl']
        s1 = '''I'm a super student.
        You're a super teacher.'''
        print(s1)#运行结果为:
        #I'm a super student.
        #You're a super teacher.
        print(s1.splitlines())#运行结果为:["I'm a super student.", "You're a super teacher."]
        print(s1.splitlines(True))#运行结果为:["I'm a super student.\n", "You're a super teacher."]
        

字符串大小写

  • upper()
    • 全大写
  • lower()
    • 全小写
  • 大小写,做判断的时候用
  • swapcase()
    • 交换大小写

字符串排版

  • title() -> str
    • 标题的每个单词都大写
  • capitalize() -> str
    • 首个单词大写
  • center(width[,fillchar]) -> str
    • width 打印宽度
    • fillchar 填充的字符
  • zfill(width) -> str
    • width 打印宽度,居右,左边用0填充
  • ljust(with[,fillchar]) -> str 左对齐
  • rjust(width[,fillchar]) -> str 右对齐
  • 中文用的少,了解一下

字符串修改

  • replace(old,new[,count]) -> str
    • 字符串中找到匹配替换为新子串,返回新字符串
    • count表示替换几次,不指定就是全部替换
    • 示例
      'www.magedu.com'.replace('w','p')#运行结果为:'ppp.magedu.com'
      'www.magedu.com'.replace('w','p',2)#运行结果为:'ppw.magedu.com'
      'www.magedu.com'.replace('w','p',3)#运行结果为:'ppp.magedu.com'
      'www.magedu.com'.replace('ww','p',2)#运行结果为:'pw.magedu.com'
      'www.magedu.com'.replace('www','python',2)#运行结果为:'python.magedu.com'
      
  • strip([chars]) -> str
    • 从字符串两端去除指定的字符集chars中的所有字符
    • 如果chars没有指定,去除两端的空白字符
    • 示例
      s = "\r \n \t Hello Python \n \t"
      s.strip()#运行结果为:'Hello Python'
      s = "I am very very very sorry"
      s.strip('ly')#运行结果为:'I am very very very sorr'
      s.strip('Iy')#运行结果为:' am very very very sorr'
      
  • lstrip([chars]) -> str
    • 从左开始
  • rstrip([chars]) -> str
    • 从右开始

字符串查找

  • 时间复杂度
    • index和count方法都是O(n)
    • 随着列表数据规模的增大,而效率下降
  • len(string)
    • 返回字符串的长度,即字符的个数
  • count(sub[,start[,end]) -> int
    • 在指定的区间 [start,end),从左至右,统计子串sub出现的次数
       s = "I am very very very sorry"
       s.count("very")#运行结果为:3
       s.count('very',5)#运行结果为:3
       s.count('very',10,14)#运行结果为:1
      
  • index(sub[,start[,end]) -> int
    • 在指定的区间 [start,end),从左至右,寻找子串sub,找到返回索引,没找到抛出异常ValueError
  • rindex(sub[,start[,end]) -> int
    • 在指定的区间 [start,end),从右至左,查找子串,找到返回索引,没找到抛出异常ValueError
      s = "I am very very very sorry"
      s.index("very")#运行结果为:5
      s.index("very",5)#运行结果为:5
      s.index('very',6,13)#运行结果为:抛出ValueError
      s.rindex('very',10)#运行结果为:15
      s.rindex('very',10,15)#运行结果为:10
      s.rindex('very',-10,-1)#运行结果为:15
      
  • find(sub[,start[,end]) -> int
    • 在指定的区间 [start, end),从左至右,寻找子串,找到返回索引,没找到返回-1
  • rfind(sub[,start[,end]) -> int
    • 在指定的区间 [start, end),从右至左,查找子串,找到返回索引,没找到返回-1
      s = "I am very very very sorry"
      s.find("very",5)#运行结果为:5
      s.find("very",6,13)#运行结果为:-1
      s.rfind('very',10)#运行结果为:15
      s.rfind('very',10,15)#运行结果为:10
      s.rfind('very',-10,-1)#运行结果为:15
      
  • partition(sep) -> (head,sep,tail)
    • 从左至右,遇到分隔符就把字符串分割成两部分,返回头、分隔符、尾三部分的三元组;如果没有找到分隔符,就返回头、两个空元素的三元组
    • sep 分割字符串,必须指定
s1 = "I am a super student"
s1.partition('s')#运行结果为:('I am a ', 's', 'uper student')
s1.partition('stu')#运行结果为:('I am a super ', 'stu', 'dent')
s1.partition('')#运行结果为:抛出ValueError
s1.partition('abc')#运行结果为:('I am a super student', '', '')
  • rpartition(sep) -> (head,sep,tail)

    • 从右至左,遇到分隔符就把字符串分割成两部分,返回头、分隔符、尾三部分的三元组,如果没有找到分隔符,就返回2个空元素和三元组
  • split(sep=None, maxsplit=-1) -> list of strings

    • 从左至右
    • sep指定分割字符串,缺省的情况下空白字符串作为分隔符
    • maxsplit指定分割的次数,-1表示遍历整个字符串
      s1 = "I'm \ta super student"
      s1.split()#运行结果为:["I'm", 'a', 'super', 'student']
      s1.split('s')#运行结果为:["I'm \ta ", 'uper ', 'tudent']
      s1.split('super')#运行结果为:["I'm \ta ", ' student']
      s1.split('super ')#运行结果为:["I'm \ta ", 'student']
      s1.split(' ')#运行结果为:["I'm", '\ta', 'super', 'student']
      s1.split(' ',maxsplit=2)#运行结果为:["I'm", '\ta', 'super student']
      
  • rsplit(sep=None, maxsplit=-1) -> list of strings

    • 从右至左
    • sep指定分隔字符串,缺省的情况下空白字符串作为分隔符
    • maxsplit指定分割的次数,-1表示遍历整个字符串
s1 = "I'm \ta super student"
s1.rsplit()#运行结果为:["I'm", 'a', 'super', 'student']
s1.rsplit('s')#运行结果为:["I'm \ta ", 'uper ', 'tudent']
s1.rsplit('super')#运行结果为:["I'm \ta ", ' student']
s1.rsplit('supter ')#运行结果为:["I'm \ta super student"]
s1.rsplit(' ')#运行结果为:["I'm", '\ta', 'super', 'student']
s1.rsplit(' ',maxsplit=2)#运行结果为:["I'm \ta", 'super', 'student']

字符串判断

  • endswith(suffic[,start[,end]]) -> bool
    • 在指定的区间[start,end),字符串是否是suffix结尾
  • startswith(prefix[,start[,end]]) -> bool
    • 在指定的区间[start,end),字符串是否是prefix开头
  • 示例
    s = "I am very very very sorry"
    s.startswith('very')#运行结果为:False
    s.startswith('very',5)#运行结果为:True
    s.startswith('very',5,9)#运行结果为:True
    s.endswith('very',5,9)#运行结果为:True
    s.endswith('sorry',5)#运行结果为:True
    s.endswith('sorry',5,-1)#运行结果为:False
    s.endswith('sorry',5,100)#运行结果为:True
    

字符串判断is系列

  • isalnum() -> bool 是否是字母和数字组成
  • isalpha() 是否是字母
  • isdecimal() 是否包含十进制数字
  • isdigit() 是否全部数字(0~9)
  • isidentifier() 是不是字母和下划线开头,其他都是字母、数字、下划线
  • islower() 是否都是小写
  • isupper() 是否全部大写
  • isspace() 是否只包含空白字符

字符串格式化

  • 字符串的格式化是一种拼接字符串输出样式的手段,更灵活方便
    • join拼接只能使用分隔符,且要求被拼接的是可迭代对象且其元素是字符串
    • + 拼接字符串还算方便,但是非字符串需要先转换为字符串才能拼接
  • 在2.5版本之前,只能使用printf style风格的print输出
    • printf-style formatting ,来自于C语言的printf函数
    • 格式要求
      • 占位符:使用%和格式字符组成,例如%s、%d等
        • s调用str(),r会调用repr()。所有对象都可以被这两个转换。
      • 占位符中还可以插入修饰字符,例如%03d表示打印3个位置,不够后面补零
      • format % values,格式字符串和被格式的值之间使用%分隔
      • values只能是一个对象,或是一个与格式字符串占位符数目相等的元组,或是一个字典
    • printf-style formatting 举例
      "I am %03d"%(20,)#运行结果为:'I am 020'
      'I like %s.'%'Python'#运行结果为:'I like Python.'
      "%3.2f%% 0x%x %#X"%(89.7654,10,256)#运行结果为:'89.77% 0xa 0X100'
      "I am %-5d"%(20,)#运行结果为:'I am 20   '
      

format函数格式字符串语法——Python鼓励使用

  • “{}{xxx}”.fromat(*args,**kwargs) -> str

    • args是可变位置参数,是一个元组
    • kwargs是可变关键字参数,是一个字典
    • 花括号表示占位符
    • {}表示按照顺序匹配位置参数,{n}表示取位置参数索引为n的值
    • {xxx}表示在关键字参数中搜索名称一致的
    • {{}}表示打印花括号
  • 对齐

    '{0}*{1} = {2:<2}'.format(3,2,2*3)#运行结果为:'3*2 = 6 '
    '{0}*{1} = {2:<02}'.format(3,2,2*3)#运行结果为:'3*2 = 60'
    '{0}*{1} = {2:>02}'.format(3,2,2*3)#运行结果为:'3*2 = 06'
    '{:^30}'.format('centered')#运行结果为:'           centered           '
    '{:*^30}'.format('centered')#运行结果为:'***********centered***********'
    
  • 进制

    "int:{0:d};hex:{0:x};oct:{0:o};bin:{0:b}".format(42)#运行结果为:'int:42;hex:2a;oct:52;bin:101010'
    "int:{0:d};hex:{0:#x};oct:{0:#o};bin:{0:#b}".format(42)#运行结果为:'int:42;hex:0x2a;oct:0o52;bin:0b101010'
    octers = [192,168,0,1]
    '{:02X}{:02X}{:02X}{:02X}'.format(*octers)#运行结果为:'C0A80001'
    
  • 浮点数

    "{}".format(3**0.5)#运行结果为:'1.7320508075688772'
    "{:f}".format(3**0.5)#运行结果为:'1.732051'#默认精度6
    "{:10f}".format(3**0.5)#运行结果为:'  1.732051'#右对齐,宽度10
    "{:2}".format(102.231)#运行结果为:'102.231'#宽度为2
    "{:.2}".format(3**0.5)#运行结果为:'1.7'#两个数字,科学计数法
    "{:.2f}".format(3**0.5)#运行结果为:'1.73'#小数点后两位
    "{:3.2f}".format(3**0.5)#运行结果为:'1.73'#宽度为3,小数点后2位
    "{:20.3f}".format(3**0.5)#运行结果为:'               1.732'
    "{:3.3%}".format(1/3)#运行结果为:'33.333%'
    

    注意:
    宽度可以被撑破,精度优先

建议使用format函数格式化字符串

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值