1.11 str 字符串

时间:2023-12-16 23:32:32

字符串属于不可变序列,是 文本序列。

  字符串的声明

>>> #字符串的声明既可以用单引号也可以用双引号,这两个能方法在效果上是一样的
>>> s = ''
>>> type(s)
<class 'str'>

>>> ss = ""
>>> type(ss)
<class 'str'>
>>>
>>> #单引号和双引号也可以混用,如果字符串中间需要一个单引号可以在两边加双引号
>>> w = "what's your name"
>>> w
"what's your name"
>>> print(w)
what's your name

>>> #单双引号的混用要注意的地方,就是其配对规律。
>>> #如在字符串中间出现单引号,还可以用转义字符的方法实现
>>> w = 'what\'s your name'
>>> w
"what's your name"
>>>
>>> w = 'abc"def'
>>> w
'abc"def'
>>>

  多行字符串的声明

>>> #用''' '''声明多行字符串
>>> s1 = '''dsgfdsds
dsgwregvfsdf
vergvdvs
vadrgbvfd'''
>>> s1
'dsgfdsds\ndsgwregvfsdf\nvergvdvs\nvadrgbvfd'
>>> print(s1)
dsgfdsds
dsgwregvfsdf
vergvdvs
vadrgbvfd
>>> #可见多行字符串是程序\n实现的,所以可以直接用字符串来实现多行字符串的效果
>>> s2 = 'nveiwdfsvnk\nvnewirovnsa\nvheirva\nvneriwb'
>>> print(s2)
nveiwdfsvnk
vnewirovnsa
vheirva
vneriwb
>>>
>>> #此外,多行字符串的声明还可以用双引号
>>> s3 = """vnewfv
vneorijv
vnekrhvf
viewrv
"""
>>> print(s3)
vnewfv
vneorijv
vnekrhvf
viewrv

>>> #如果单双引号混用呢?
>>> s4 = '''vneirnvsk
nveowrsvf
vewrov
vnewo"""

KeyboardInterrupt
>>> #可见由于没有输入第二个''',会认为第一个'''后的所有内容都是多行字符串中的内容,会继续接受输入,等待第二个'''
>>> 

  字符串中的转义字符

>>> #字符串中最常见的转义字符应该就是换行符了
>>> s = 'abcdefhg'
>>> s
'abcdefhg'
>>> s1 = 'abcd\nefhg'
>>> s1
'abcd\nefhg'
>>> print(s1)
abcd
efhg
>>>

\a 响铃
\b 退格
\n 换行
\t tab键
\' 或 \" 转义 ' "
\? 转义一个?
\0 表示一个空字符
\o 开头表示以八进制数声明字符
\x 开头表示以十六进制数声明字符

后边会经常遇到写文件路径的情况,文件路径中的\ 的处理有两种方法
第一种方法:用\ 转义 \
>>> path = "C:\\abc\\xyz\\tag.txt"
>>> print(path)
C:\abc\xyz\tag.txt

第二种方法:用r来声明字符串中的\不是转义符。r表示原始字符串。可以忽略转义符。
>>> path = r'C:\abc\xyz\tag.txt'
>>> print(path)
C:\abc\xyz\tag.txt

  字符串是序列,支撑序列的通用操作

  字符串虽然属于不可变序列,但由于字符串使用频率很高,且实际应用中会有很多需要修改字符串的应用场景,故Python内置了一些函数来改变字符串,下面逐一进行介绍

字符串常用操作一:将其他类型的数据转化为字符串的全局函数str(obj)

>>> '+5
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    '+5
TypeError: Can't convert 'int' object to str implicitly
>>> int(') + 5
38
>>> ' + str(5)
'
>>> 

字符串常用操作二:改变字符串中的字符的函数replace(old,new[,count])

 >>> s = 'www.baidu.com'
 >>> #把字符串中的第一个w修改为y
 >>> s1 = s.replace('w','y',1)
 >>> s1
 'yww.baidu.com'
 >>> s
 'www.baidu.com'
 >>> #由s1和s的对比发现,原字符串不变,替换后的字符串是又新生成的字符串
 >>>
 >>> #如果我想把前两个w,替换成a
 >>>
 >>> s2 = s.replace('w','a',2)
 >>> s2
 'aaw.baidu.com'
 >>>
 >>> #如果字符串中的w是不连续的,想一次性替换多个
 >>> s = 'ababab'
 >>> #把s中的3个a替换成c
 >>> s.replace('a','c',3)
 'cbcbcb'
 >>> #看来不连续的也可以一次性替换,如果第三个参数传递的值大于字符串中需要被替换的字符的总数,会如何
 >>> s
 'ababab'
 >>> s.replace('a','c',4)
 'cbcbcb'
 >>> #那就是有多少就替换多少
 >>>
 >>> #replace的第一个和第二个参数都是可以包含多个字符的字符串
 >>> url = 'www.baidu.com'  #想把这个字符串中的com替换成cn
 >>> url.replace('com','cn')
 'www.baidu.cn'
 >>>
 >>>
 >>>
 >>> #其实还有另外一个思路来替换字符串中的字符或子字符串,那就是我们手动切割字符串并拼接,用什么切割呢?还记得切片吗?
 >>> #把www.baidu.com的第一个w替换成a
 >>> s = 'www.baidu.com'
 >>> s2 = 'a' + s[1:]
 >>> s2
 'aww.baidu.com'
 >>> 

字符串常用操作三:将应为字符串的第一个英文字母大写

 >>> s = 'www.baidu.com'
 >>> s.capitalize()
 'Www.baidu.com'
 >>> s1 = '(www.baidu.com)'
 >>> s1.capitalize()
 '(www.baidu.com)'
 >>> #看来这个函数只能把第一个字符是英文字母的字符串的第一个字符变成大写
 >>> s2 = 'Www.baidu.com'
 >>> s2.capitalize()
 'Www.baidu.com'
 >>> s3 = 'w()'
 >>> s3.capitalize()
 'W()'
 >>> 

字符串常用操作四:将字符串中所有的英文字母变成大写upper()

>>> s = 'www.baidu.com'
>>> s.upper()
'WWW.BAIDU.COM'

字符常用操作五:将字符串中所有的英文字母变成小写lower()

 >>> s = 'www.baidu.com'
 >>> s.upper()
 'WWW.BAIDU.COM'
 >>> s.upper().lower()
 'www.baidu.com'
 >>> 

字符串常用操作六:判断字符串是否以某个特定的字符串开头 startswith('str')

 >>> s = 'www.baidu.com'
 >>> s.startswith('w')
 True
 >>> s.startswith('ww')
 True
 >>> s.startswith('sw')
 False
 >>> 

字符串常用操作七:判断字符串是否以某个特定的字符串结尾 endswith('str')

 >>> s
 'www.baidu.com'
 >>> s.endswith('com')
 True
 >>> s.endswith('cn')
 False
 >>> 

字符串常用操作八:判断当前字符串的字符是否为数字 isnumeric()

>>> #如果一个字符串中不是数字而要转化为整型或浮点型会如何
>>> s = 'ss'
>>> int(s)
Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    int(s)
ValueError: invalid literal for int() with base 10: 'ss'
>>>
>>> #所以想把字符串转化成数字前,需要判断字符串中是否为数字
>>> s = '
>>> if s.isnumeric():
    print(int(s) + 1)

4
>>> float(s) + 1         #可见整型可以转换为浮点型
4.0
>>>
>>> s = '3.0'
>>> int(s)               #浮点型转化为整型会报错
Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    int(s)
ValueError: invalid literal for int() with base 10: '3.0'
>>> float(s)
3.0
>>> 

字符串常用操作九:判断当前字符串的字符是否为字母 isalpha()

 >>> s = '
 >>> s.isalpha()
 False
 >>>
 >>> s = 'a'
 >>> s.isalpha()
 True
 >>> 

字符串常用操作十:将字符串按特定字符将其拆分成列表 split()

>>> #按照一定的字符拆分字符串是一个常用的操作,如拆分URL,获取一些内容
>>> s = 'www.baidu.com'
>>> s.split()
['www.baidu.com']
>>>
>>> s.split('.')
['www', 'baidu', 'com']
>>> #看来这个函数需要一个参数作为分隔的标记
>>> u = r'c\dvsdn\vefvdn\vreiov\vnde'
>>> u.split('\\')
['c', 'dvsdn', 'vefvdn', 'vreiov', 'vnde']
>>> #可见拆分出的字符串放在一个列表中,然后根据需要从列表中取值处理
>>> 

字符串常用操作十一:将列表中的元素按照特定的字符串连接成字符串 join()

 >>> #join()可以理解成是split()的反向操作
 >>> s = 'www.baidu.com'
 >>> s.split()
 ['www.baidu.com']
 >>> s.split('.')
 ['www', 'baidu', 'com']
 >>>
 >>> #我现在不想用'.'连接,,用'。’连接如何操作呢
 >>> l=s.split('.')
 >>> '。'.join(l)
 'www。baidu。com'
 >>>  #可见这个连接符号是可以自定义的

字符串常用操作十二:格式化字符串 format()

 参数的三种传递方法

 # 1 位置参数1
 >>> '身高:{} 米,体重:{} 千克'.format(h,w)
 '身高:1.8 米,体重:70 千克'
 >>> #该参数传递方法是按位置传递的,字符串中的{}的顺序和format()的参数的顺序一致
 >>> #如果参数少的话没关系,但是参数较多的话,就比较难对应了 

  # 2 数字索引
  >>> '姓名:{0},身高:{1},体重:{2},大家欢迎{0}同学'.format(n,h,w)
  '姓名:Mark,身高:1.8,体重:70,大家欢迎Mark同学'
  >>> #可见format()的某个参数在字符串中多次出现的话,用这种方法方便些

  # 3 关键字参数
  >>>#还可以用变量名的方法传递参数,这样更容易将字符串中和format()中的参数对应起来,可读性更好
  >>> '姓名:{name} 身高:{height} 体重:{weight}'.format(name=n,height=h,weight=w)
  '姓名:Mark 身高:1.8 体重:70'

  #数字索引和关键字参数是可以混用的,需要注意的是某个位置使用了关键字参数,其后都要用关键字参数

 # 4 通过对象属性
 class Person:
     def __init__(self,name,age):
         self.name = name
         self.age = age
     def __str__(self):
         return 'This guy is {self.name},is {self.age} old'.format(self=self)

 str(Person('kzc',18))
 'This guy is kzc,is 18 old'

 # 5 使用索引
  >>> l = ['hoho', 18]
  >>> 'name is {0[0]} age is {0[1]}'.format(l)
  'name is hoho age is 18

  #在format()参数中及字符串中的{}中添加一些格式限定符实现一些高级的操作
  # 1 将参数设置为10个字符的长度,不足的前边补空格
  >>> '{:10}'.format(123.1123)
  ' 123.1123'

  # 2 设置字符串的左对齐和右对齐和居中对齐
  >>> '{:>10}的钱数{:<20}'.format('Mark',100000000000)
  ' Mark的钱数100000000000 '
  #可以理解为<,>的尖的方向就是要对齐的方向
  # ^、<、>分别是居中、左对齐、右对齐

  # 3 设置浮点数精度
  >>> '{},{},{}'.format(3.14159,3.14159,3.14159)
  '3.14159,3.14159,3.14159'

  >>> '{f},{.2f},{}'.format(3.14159,3.14159,3.14159)
  '3.141590,3.14,3.14159'
  #第一个f表示以浮点数显示,默认保存小数后6位,不足的补0
  #第二个 .2f表示保留小数后2位,当然,保留几位可自定义,多余的部分四舍五入
  #第三个 什么格式也不限制,就按默认的形式输出

  >>> {06.2f}'.format(3.14159)
  '3.141590,3.14,003.14'
  #设置为6位长度,小数后是2位的浮点数,6前的0 表示前边不足的补0,否则就是补空格,因为是数字嘛,所以前面只能用0或空格来填充,不能用别的字符

  #格式化处理整数值
  >>> '{:X},{:o},{:b}'.format(230,230,230)
  'E6,346,11100110'57
  #默认是以十进制显示的
  #X:十六进制 o:八进制 b:二进制

 #用逗号来表示千分位
 >>> '{:,}'.format(1234567890)
 '1,234,567,890'
 >>>

 #将浮点数以百分数形式显示
 >>> '{:%}'.format(3/4)
 '75.000000%'
 >>> #可知默认的小数点后边有6位
 >>> #可以用如下形式限制百分数后的小数点位数
 >>> '{:.2%}'.format(3/4)
 '75.00%'
 >>>

 #大括号可以写两遍来转义
 >>>format("Empty dict: {{}}")
 >>>"Empty dict: {}"

字符串常用操作十三:移除字符串头尾指定的字符(默认为空格)strip()

 >>> s = '    abc'
 >>> s
 '    abc'
 >>> s.strip()
 'abc'
 >>>
 >>> ss = 'aaabbbcccaaaa'
 >>> ss.strip('a')
 'bbbccc'
 >>> #可见strip()函数会将字符串两侧所有与参数匹配到的部分去掉

 >>> ss = 'aaabbbcccaaaa'
 >>> ss.strip('a')
 'bbbccc'
 >>> sss = 'aaabbb'
 >>> sss.strip('aa')
 'bbb'
 >>> ssss = 'abcabcab'
 >>> ssss.strip('abc')
 ''
 >>> sss.strip('ab')
 ''
 #可见如果strip()的参数多余一个字符时,strip()会将参数拆分,然后拿拆分后的
 #部分与需要处理的字符串的两侧做匹配,