05-03字符串与其常用操作

目录

字符串及其操作

字符串是集合类型, 并不是一个基本类型

字符串对象操作

新建字符串

  • 方法1:s = 'hello python'
  • 方法2:s = "hello python"
  • 方法3:s = '''hello python'''
  • 方法4:s = """hello python"""

前两种完全一样, 后两种完全一样
三引号可以定义多行字符串,单/双引号只能定义单行字符串

方法3或方法4与方法1或方法2的区别:
    In [42]: s = '''hello python
        ...: i like python'''

    In [43]: s = 'hello python
      File "<ipython-input-43-07b7eed529d4>", line 1
        s = 'hello python
                         ^
    SyntaxError: EOL while scanning string literal

    三引号可以定义多行字符串
    单/双引号只能定义单行字符串

删除字符串对象

需要使用del方法删除
截至2020年5月23日,本人暂时还未发现其他的方法

字符串元素操作

转义

转义字符(这里的不全,可以互联网搜索)

  • \n:换行
  • \t:制表符
  • \r:回车

回车与换行区别:老式打印机

换行是纸带往上移动一行。
回车是把针头回到开始位置。
window是\n\r换行。unix是\n。

python3中加r前缀代表此字符串是自然字符串

In [47]: s = 'i like \npython'

In [48]: print(s)
i like 
python

In [49]: s = 'i\'m comyn'    #'有特殊作用,所以需要\'转义一下

In [50]: print(s)
i'm comyn

三引号常用于:
sql = '''select * from `table` where name='comyn' '''


取消转义场景
In [52]: path = 'c:\windows\nt\system32'    # 正常情况显示

In [53]: print(path)
c:\windows
t\system32

In [54]: path = 'c:\windows\\nt\system32'    # 取消转义

In [55]: print(path)
c:\windows\nt\system32

In [56]: path = 'c:\\windows\\system32'   # 也可以将所有的都转移,以防万一。

In [57]: path = r'c:\windows\nt\system32'   # 加r前缀代表此字符串是自然字符串, 不会转义,python3中只有\r前缀。python2中有\u前缀。

In [58]: print(path)
c:\windows\nt\system32

In [59]: '\n' == '\r'    # \n和\r是不相等的。
Out[59]: False

In [60]: print("123\r45")    # \r回到起点,将12盖掉了
453
python3中所有字符串都是unixcode

查询操作

下标操作

  • 字符串也支持下表操作
  • 字符串是无法通过下标更改的
  • 字符串是可迭代对象,也就是说可以作为for循环的值
In [61]: s 
Out[61]: "i'm comyn"

In [62]: s[3]
Out[62]: ' '

In [63]: s[4]
Out[63]: 'c'

In [64]: type(s[4])
Out[64]: str

In [65]: s[4] = C    # 字符串是不可变的
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-65-a888c3296699> in <module>()
----> 1 s[4] = C

NameError: name 'C' is not defined

In [66]: s
Out[66]: "i'm comyn"

字符串是可迭代对象:
    In [67]: for c in s:
        ...:     print(c)
        ...:
    i
    '
    m

    c
    o
    m
    y
    n

字符串的操作

连接

str.join连接,将可迭代对象转换为字符串
注意:此操作会返回一个新的字符串对象,但不会操作原有可迭代对象

In [73]: lst = ['i', 'am', 'comyn']

In [74]: ' '.join(lst)   # join是字符串的方法,参数是可迭代对象,接收者是分隔符
Out[74]: 'i am comyn'

In [76]: ','.join(lst)
Out[76]: 'i,am,comyn'

In [77]: ''.join(lst)
Out[77]: 'iamcomyn'

分割

分割:指定分隔符对字符串进行切片

split通过指定分隔符对字符串进行切片,返回一个list
  • split默认使用空格分割
  • 多个空格当成一个空格处理
  • 当指定了以空格为分割符时,每个空格都处理
  • s.split(maxsplit=1) # 只分割一次,maxsplit参数表示分割多少次,默认是-1, 表示分割所有分隔符
  • s.split('lo') # 分隔符可以是任意字符串
In [78]: s = 'i love python'

In [80]: s.split()    # split默认使用空格分割
Out[80]: ['i', 'love', 'python']

In [81]: 'i     love python'.split()   # 多个空格当成一个空格处理
Out[81]: ['i', 'love', 'python']

In [82]: 'i     love python'.split(' ')   # 当指定了以空格为分割符时,每个空格都处理
Out[82]: ['i', '', '', '', '', 'love', 'python']

In [83]: s.split(maxsplit=1)   # 只分割一次
Out[83]: ['i', 'love python']

In [84]: 'i i i i i i i i i'.split(maxsplit=2)   # split从左往右分割字符串, maxsplit参数表示分割多少次, 默认为-1, 表示分割所有分隔符。
Out[84]: ['i', 'i', 'i i i i i i i']

In [85]: s.split('o')   # 指定o为分割符
Out[85]: ['i l', 've pyth', 'n']

In [86]: s.split('lo')   # 分隔符可以是任意字符串
Out[86]: ['i ', 've python']


split的实现:
In [90]: def split(s, sep, maxsplit):
    ...:     ret = []
    ...:     tmp = []
    ...:     i = ()
    ...:     for c in s:
    ...:         if c != sep:
    ...:             tmp.append(c)
    ...:         else:
    ...:             i += 1
    ...:             ret.append(''.join(tmp))
    ...:             tmp.clear()
    ...:         if maxsplit > 0 and i >= maxsplit:
    ...:             ret.append()
    ...:             return ret
    ...:     return ret
rsplit

rsplit:是split从右往左的版本

In [87]: 'i i i i ii i i'.rsplit(maxsplit=1)
Out[87]: ['i i i i ii i', 'i']

In [88]: 'i i i i ii i i'.rsplit()
Out[88]: ['i', 'i', 'i', 'i', 'ii', 'i', 'i']

In [89]: 'i i i i ii i i'.split()
Out[89]: ['i', 'i', 'i', 'i', 'ii', 'i', 'i']
当不是用maxsplit参数时, split和rsplit表现形式一样,但是split效率高于rsplit


rsplit的实现:
In [91]: def rsplit(s, sep, maxsplit):
    ...:     ret = []
    ...:     tmp = []
    ...:     i = ()
    ...:     for c in reversed(s):
    ...:         if c != sep:
    ...:             tmp.append(c)
    ...:         else:
    ...:             i += 1
    ...:             ret.append(''.join(reversed(tmp)))
    ...:             tmp.clear()
    ...:         if maxsplit > 0 and i >= maxsplit:
    ...:             ret.append()
    ...:             return reversed(ret)
    ...:     return reversed(ret)
splitlines:分割行
  • 返回结果不会带换行符
In [92]: s = ''' i am comyn
    ...: i love python'''

In [93]: s.splitlines()   # 按行分割,并且返回结果不带换行符
Out[93]: [' i am comyn', 'i love python']

In [94]: s.splitlines(True)   # 按行分割, 并且返回结果带换行符
Out[94]: [' i am comyn\n', 'i love python']
partition返回三元组
  • 当要分割的内容为空时,返回也为空
  • 当要分割的内容为要返回的内容时, 除了sep, 其他都为空
In [95]: 'i am comyn'.partition(' ')   # 总是返回一个三元组, 它按传入分割符分割一次,得到 head tail, 返回结果是head, sep, tail。(sep是指分隔符)
Out[95]: ('i', ' ', 'am comyn')


partition的实现:
In [103]: def partition(s, sep):
     ...:     if s == '':
     ...:         return '','',''
     ...:     tmp = s.split(sep, mapsplit=1)
     ...:     if len(tmp) == 2:
     ...:         return tmp[0], sep, tmp[1]
     ...:     if len(tmp) == 1:
     ...:         return tmp[0], sep, ''
     ...:     if len(tmp) == 0:
     ...:         return '', sep, ''
rpartition

rpartition:是partition从右往左的版本

In [96]: cfg = 'mysql.connect = mysql://user:password@127.0.0.1:3306/test'

In [97]: cfg.partition('=')
Out[97]: ('mysql.connect ', '=', ' mysql://user:password@127.0.0.1:3306/test')

In [98]: cfg = 'env = PATH=/usr/bin:$PATH'

In [99]: cfg.partition('=')
Out[99]: ('env ', '=', ' PATH=/usr/bin:$PATH')

In [100]: ''.partition('=')   # 当要分割的内容为空时,返回也为空
Out[100]: ('', '', '')

In [101]: '='.partition('=')   # 当要分割的内容为要返回的内容时, 除了sep, 其他都为空
Out[101]: ('', '=', '')

转换

经常用在英文书写格式上面,比如首字母大写。

In [104]: s = 'test'

In [105]: s.upper()   # 全部转换为大写
Out[105]: 'TEST'

In [106]: s.upper().lower()   # 先转换为大写,然后转换为小写
Out[106]: 'test'

In [107]: s.title()   # 首字母转换为大写
Out[107]: 'Test'

In [108]: s.capitalize()   # 首字母转换为大写
Out[108]: 'Test

In [109]: 'i love python'.title()   # 与capitalize的区别, title常用于标题
Out[109]: 'I Love Python'

In [110]: 'i love python'.capitalize()   # 与title的区别, 常用于正文
Out[110]: 'I love python'

In [111]: s.center(80)    # 标题居中
Out[111]: '                                      test                                      '

In [112]: s.zfill(80)    # 居右,用0填充
Out[112]: '0000000000000000000000000000000000000000000000000000000000000000000000000000test'

In [117]: s.casefold()   # 原地返回
Out[117]: 'test'

In [118]: 'Test TTset'.casefold()   # 使用大小写不同的测试, 全转换为大写或小写, 不同的平台有不同的表现形式, 但是同一个平台下, 表现形式相同, 通常用来忽略大小写的比较。忽略大小写。
Out[118]: 'test ttset' 

In [119]: s.swapcase()   # 大小写互换
Out[119]: 'TEST'

In [120]: 'Test'.swapcase()   # 大小写互换
Out[120]: 'tEST'

In [121]: '\t'.expandtabs(4)   # 将table制表符转换为空格
Out[121]: '    '

In [123]: s.format()   # 单独讲,变化非常多,非常常用。
Out[123]: 'test'
upper:全部转换为大写
lower:全部转换为小写
title:标题,首字母大写
capitalize:首字母大写,常用于正文
center:标题居中
zfill:标题居右, 用0填充
casefold:忽略大小写
swapcase:大小写互换
expandtabs:将table制表符转换为空格

修改

In [124]: s = 'i love python'

In [125]: s.replace('love', 'give up')  # 返回新字符串,使用new替换old
Out[125]: 'i give up python'

In [127]: s = 'i very very love python'

In [128]: s.replace('very', 'not')   # 有多少个替换多少个
Out[128]: 'i not not love python'

In [129]: s.replace('very', 'not', 1)   # 可选的count参数,指定替换多少次
Out[129]: 'i not very love python'

replace只能从前往后替换

In [130]: s = '     hahahahahah haha    '

In [131]: s.strip()   # strip移除字符串前后的空格
Out[131]: 'hahahahahah haha'

In [132]: s = '\n \r \t hahaha \t \n \r'

In [133]: s.strip()   # strip移除前后的空白字符
Out[133]: 'hahaha'
注意:空格和空白是不一样的概念

In [135]: s = '######haha #### haha #####'

In [136]: s.strip('#')   # 指定移除字符 
Out[136]: 'haha #### haha '

In [138]: s = '{{ haha }}'  

In [139]: s.strip('{}')    # 指定移除多个字符
Out[139]: ' haha '

In [140]: s.strip('{} ')   # 多加个空白,移除空白字符
Out[140]: 'haha'

In [141]: s.lstrip('{} ')   # lstrip表现和strip一样,但是只处理左端
Out[141]: 'haha }}'

In [142]: s.rstrip('{} ')   # rstrip表现和strip一样,但是只处理右端
Out[142]: '{{ haha'

In [143]: s = 'test'   

In [144]: s.ljust(10)    # 原串在左边
Out[144]: 'test      '

In [145]: s.rjust(10)    # 原串在右边
Out[145]: '      test'

In [146]: s.center(10)   # 原串在中间
Out[146]: '   test   '

In [147]: s.center(10, '#')   # 原串在中间,使用指定字符填充
Out[147]: '###test###'

In [148]: s.ljust(10, '#')   # 原串在右边,使用指定字符填充
Out[148]: 'test######'

In [149]: s.center(10, '##')   # 填充字符串长度只能为1
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-149-6e82a3cbddcf> in <module>()
----> 1 s.center(10, '##')

TypeError: The fill character must be exactly one character long

In [150]: s.center(3)   # 如果宽度小于等于原串长度,不做任何操作
Out[150]: 'test'

In [152]: s.center(11, '#')   # 优先填充左边
Out[152]: '####test###'
replace:替换, 全替换
strip:移除字符串前后的空格
lstrip:移除左端的字符
rstrip:移除右端的字符
center:居中, 可以使用随意字符串填
ljust:原串在左边
rjust:原串在右边

查找

In [155]: s = 'i love python'

In [156]: s.find('love')   # 从左往右查找,找到第一个字串love,返回字串首字母的索引
Out[156]: 2 

In [157]: s.find('love1')   # 当字串不存在时,返回-1
Out[157]: -1

In [158]: s = 'i very very love python'

In [159]: s.find('very')    # 当有多个值的时候,返回第一个
Out[159]: 2

In [160]: s.find('very', 3)   # start参数指定从哪里开始查找
Out[160]: 7

In [161]: s.find('very', 3, 5)   # end参数指定到哪里结束查找, end不包含
Out[161]: -1

In [162]: s.rfind('very')   # rfind是find从右往左的版本
Out[162]: 7

In [163]: s.rfind('very', 3)  # start和stop意义一样,事实上, 是先根据start和stop截取字符串,再查找
Out[163]: 7

In [164]: s.rfind('very', 8)
Out[164]: -1

In [165]: s.index('very')   # 几乎与find一模一样
Out[165]: 2

In [166]: s.index('very', 3)
Out[166]: 7

In [167]: s.index('very', 8)    # 不存在的抛出ValueError, find查找不存在的时候返回-1, index和find惟一区别。
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-167-c5dce18db14c> in <module>()
----> 1 s.index('very', 8)

ValueError: substring not found

In [3]: s.rindex('very')    # rindex是index从右往左的版本
Out[3]: 7

In [5]: s.count('very')   # 存在
Out[5]: 2

In [6]: s.count('haha')   # 不存在返回0
Out[6]: 0

In [7]: s.count('very', 3)   # 从第三个开始统计
Out[7]: 1
s.find:查找, 从左至右
s.rfind:查找, 从右至左
s.index:根据值找出位置
s.rindex:是index的从右至左的版本
s.count:统计关键词出现的次数

判断

In [8]: s.startswith('i very')    # 判断字符串是否以某个前缀开始,返回结果是bool
Out[8]: True

In [9]: s.startswith('abc')
Out[9]: False

In [10]: s.startswith('very', 2)   # start参数表示的是从索引start处开始比较
Out[10]: True

In [11]: s.startswith('very', 2, 5)  # end参数表示从索引end处停止比较
Out[11]: False

In [12]: s.endswith('python')   # 判断字符串是否以某个后缀结尾, 返回bool
Out[12]: True

In [3]: s.endswith('python', 17)   # start参数表示从索引start处开始比较
Out[3]: True

In [5]: s.endswith('python', 0, 22)   # end参数表示到索引end为止, 不包含end
Out[5]: False

In [6]: 'a'.isalnum()   # 检测字符串是否由字母和数字组成;
Out[6]: True

In [81]: s.isalnum()   # 因为s含有空格, 所以返回False
Out[81]: False

In [82]: s.isidentifier()   # 字符是否是合法标示符
Out[82]: False

In [84]: 'abc_123'.isidentifier()
Out[84]: True

合法标示符:
    字母或者下划线开头
    仅包含字母数字和下划线

In [9]: 'a'.isidentifier()
Out[9]: True

string模块是补充自带字符方法不够的模块;
s.startswith:判断字符串是否以某个前缀开始,返回结果是bool
s.endswith:end参数表示从索引end处停止比较
s.isalnum:检测字符串是否由字母或数字,多个空格都不行
s.isdecimal:检查字符串是否只包含十进制字符,这种方法只存在于unicode对象。
s.islower:检测字符串是否由小写字母组成
s.isspace:检测字符串是否只由空格组成。
s.isalpha:检测字符串是否只由字母组成。
s.isdigit:检测字符串是否只由数字组成。
s.isnumeric:检测字符串是否只由数字组成,这种方法是只针对unicode对象。
s.istitle:检测字符串中所有的单词拼写首字母是否为大写,且其他字母为小写。
s.isascii:判断字符串是否只包含ASCII字符
s.isidentifier:用于判断字符串是否是有效的Python标识符,可用来判断变量名是否合法。
s.isprintable:如果所有字符都是可打印的,则isprintable()方法返回True,否则返回False。不可打印的字符可以是回车和换行符。
s.isupper:检测字符串中所有的字母是否都为大写
posted @ 2020-05-28 22:37  此时  阅读(167)  评论(0编辑  收藏  举报