#10 Python字符串
前言
通过上一节可知,python6个序列的内置类型中,最常见的是列表和元组,但在python中,最常用的数据类型却不是列表和元组,而是字符串。要想深入了解字符串,必须先掌握字符编码问题。因此本篇博文将讲解python字符编码问题和python字符串的具体方法!
一、python字符编码
前提:计算机只认识两个数字:0和1,计算机在处理任何数据时,都要将数据转换为这两个数字的组合。
1.计算机的单位制
计算机在设计时,最小单位是 位(bit) ,位里面只能有两种情况,0或者1。位太过单调,只有两种情况,显然无法处理数据,所以引入 字节(byte) ,1字节=8位(1b = 8b),也就是说计算机一次能处理8位数据,早期的计算机都是8位的,现在的计算机有32位的,有64位的,显然现在的计算机相比以前运算能力大大提高。1字节能表示的最大整数为255(二进制1111 1111 = 十进制255)。对于存储介质来说,1个字节存储能力显然太弱,于是就有了kb、mb、gb、tb、pb、eb、zb、yb、bb、nb、db.....的出现:
1tb=1024gb 1gb=1024mb 1mb=1024kb 1kb=1024b 1b=8b
2.asc码
由于计算机无法识别人类使用的语言,所以聪明的人类创造了一种映射关系,即让某一个数字映射到人类语言的某一个字符,比如:1---> a,这样计算机就可以识别人类语言了。因为第一台计算机是在美国诞生的,最早美国人只将常用的符号、大写英文和小写英文共127个字符编码映射到计算机中,这个编码表就是著名的asc编码表,这个asc码表最多只有8位,也就是说最多只能表示255个字符。
3.gb2312
后来计算机推向全球,中国人也要使用,但是早期的电脑里只有asc码,中国人肯定不乐意啊,我大中华几千年的优秀文化,最牛的就是汉字了!然而汉字有好多啊,可不止255个,就算把asc码表重新编一次,也不够用啊,再说,asc码表谁也不能重新编人家,那怎么办呢?聪明的中国程序员对汉字进行了分区,分为94个区,每个区里有94个汉字。查找汉字时,找到它所在的区,再找到它所在区的哪个位置,就对一个汉字精确定位了,所以gb2312又称为区位码。gb2312*收录6763个汉字,其中一级汉字3755个,二级汉字3008个,同时收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个字符。
4.gbk
后来,中国人又出现了新问题,gb2312支持的汉字太少了,随着国人人取名字越来越奇葩( ̄_ ̄|||),gb23132根本就无法处理,于是gbk就应运而生了。gbk支持的字符那是相当的多,现在中国计算机使用的依旧是gbk,不信你可以验证一下,再windows下的命令行里输入 chcp ,应该会显示active code page:936 ,这个936就代表gbk。
5.unicode
随着计算机在各国的普及,每个国家都有自己独特的编码方式,就出现了新的问题,日本人开发的软件在中国的计算机上运行的时候,会出现乱码,这样就会造成沟通障碍,为了解决类似问题,国际上的计算机头头组织决定让全世界的编码统一,于是unicode就出现了,unicode规定每个字符最少用16位表示。成功统一的编码,这就时unicode。
6.utf-8
unicode的出现,几家欢喜几家愁啊,中国人觉得海星,美国人不乐意了,原来我的所有字符都是用8位(1字节)表示,现在莫名其妙就要用16位(2字节)表示,本来1gb的文件,现在变成2gb了,搁谁也受不了啊!那怎么办呢?于是utf-8便出现了,utf-8是对unicode的压缩和优化,utf-8不再规定必须最少用2个字节了,而是将字符进行分类:asc码中的字符还是 1字节,欧洲使用2字节,东亚使用3字节。perfect~~
7.python3字符编码
在python3中,默认的字符编码是unicode。
二、python字符串
介绍完了字符编码的知识就该进入正题了,字符串作为python最常用的数据类型,那一定有它独特的魅力,盘它!
先来看看字符串的具体方法:
in [1]: dir(str) out[1]: ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
从上面可以看到,字符串的方法那是超级多啊⊙﹏⊙∥
注意:字符串同元组一样,其内部元素不可以被修改
1.初始化字符串
in [2]: name = 'minutesheep' # 单引号 in [3]: gender = 'm' # 一个字符也是字符串 in [4]: introduction = "i'm minutesheep" # 双引号 in [5]: info = ''' # 三引号 ...: i am, ...: the, ...: best man ...: ''' # 前面已经说过他们的区别与用法,这里就不再重复了
2.字符串索引
通过索引访问字符串元素:同列表用法一样
in [19]: name = 'minutesheep' in [20]: name[0] # 同列表用法一样 out[20]: 'm' in [21]: name[5] out[21]: 'e' in [22]: name[-1] out[22]: 'p' in [23]: name[-6] out[23]: 'e'
通过元素获取索引:有两种方法:str.index() , str.find()
in [24]: name = 'minutesheep' in [25]: name.index('s') # 查找一个字符在字符串中的索引 out[25]: 6 in [26]: name.index('te') # 查找子字符串在字符串中的索引,如果有多个子字符串,则返回第一个的索引 out[26]: 4 in [31]: name.index('te',3,9) # 可以指定查找范围:第3个字符到第9个字符 out[31]: 4 in [27]: name.index('sp') # 当查找的字符或字符串不存在时,抛出没找到的异常 --------------------------------------------------------------------------- valueerror traceback (most recent call last) <ipython-input-27-1d8e59855f71> in <module> ----> 1 name.index('sp') valueerror: substring not found in [28]: name.find('s') # 用法和str.index()类似 out[28]: 6 in [29]: name.find('te') # 用法和str.index()类似 out[29]: 4 in [32]: name.find('te',3,9) # 用法和str.index()类似 out[32]: 4 in [30]: name.find('sp') # 当查找的字符或字符串不存在时,返回-1,就这点不一样 out[30]: -1
3.字符串切片
使用方法同列表一样
in [34]: name = 'minutesheep' in [35]: name[:] # 使用方法同列表一样 out[35]: 'minutesheep' in [36]: name[:4] out[36]: 'minu' in [37]: name[5:-1] out[37]: 'eshee' in [38]: name[3:9:2] out[38]: 'ueh'
4.字符串组合
字符串相加:直接用 + 号将两个字符串加起来,效果如下:
in [40]: name1 = 'minutesheep' in [41]: name2 = 'heenoor' in [42]: name1 + name2 out[42]: 'minutesheepheenoor'
字符串拼接:
in [51]: '-'.join('minutesheep') # 将字符串的每个字符用 - 拼接起来 out[51]: 'm-i-n-u-t-e-s-h-e-e-p' in [53]: '-'.join(['minutesheep','heenoor']) # 将列表的每个元素用 - 拼接起来 out[53]: 'minutesheep-heenoor' in [55]: '-'.join({'a':3,'b':5}) # 将字典的key值用 - 拼接起来 out[55]: 'a-b'
字符串居中:
in [56]: name = 'minutesheep' in [58]: name.center(20,'*') # 使用str.center(数量,符号)方法将字符串居中 out[58]: '****minutesheep*****'
字符串乘法:同列表一样
in [60]: 'minutesheep' * 5 out[60]: 'minutesheepminutesheepminutesheepminutesheepminutesheep'
5.字符串统计
统计字符串长度:使用len()查看:
in [61]: name out[61]: 'minutesheep' in [62]: len(name) out[62]: 11
统计指定字符出现次数:使用str.count()方法:
in [61]: name out[61]: 'minutesheep' in [63]: name.count('e') out[63]: 3
6.字符串转义
在python中,有些字符被转义了,通常字符前面有 \ 代表转义字符,比如 '\n' 代表换行符,其他的转义字符见下表:
\(在行尾时) # 续行符 \\ # 反斜杠符号 \' # 单引号 \" # 双引号 \a # 响铃 \b # 退格(backspace) \e # 转义 \000 # 空 \n # 换行 \v # 纵向制表符 \t # 横向制表符 \r # 回车 \f # 换页 \oyy # 八进制数,yy代表的字符,例如:\o12代表换行 \xyy # 十六进制数,yy代表的字符,例如:\x0a代表换行 \other # 其它的字符以普通格式输出
如果字符串需要这些字符又该怎么办呢,比如 s = '\n' ,运行代码后python就会将 \n 识别为换行,如果字符串需要出现 \n,那就再转义即可,如 s = '\\n'
in [73]: s = '\n' in [74]: s out[74]: '\n' in [75]: print(s) in [76]: s = '\\n' in [77]: print(s) \n
但如果一个字符串中转义符过多的话,想要同时让这些转义符出现再字符串中,那岂不是要一个一个再转义,其实,python中有一个简单的方法,那就是再创建的字符串前面加一个 r 或者 r ,例如:
in [78]: s = r'\n' in [79]: print(s) \n in [80]: s = r'\n' in [81]: print(s) \n
7.字符串格式化
字符串的格式化可以说是一种动态编程,相当于创建一个模板,填写内容即可,例如:你好,我叫xxx,我今年xxx岁了,我的电话号码是xxx。盘它!
使用 % :
in [82]: name = 'minutesheep' in [83]: 'hello, i am %s' % name # 只有一个%时,可以不加括号 out[83]: 'hello, i am minutesheep' in [84]: name2 = 'heenoor' in [86]: 'hi, i am %s, i am the friend of %s' % (name2, name) # 大于一个%时,必须加括号 out[86]: 'hi, i am heenoor, i am the friend of minutesheep'
以上代码就做到了一个动态编程,用%s占位,之后用其他内容替换它。
其实,在python中,%s属于字符串占位符,还有其他的占位符:
%c # 格式化字符及其ascii码 %s # 格式化字符串,最常用 %d # 格式化整数,比较常用 %u # 格式化无符号整型 %o # 格式化无符号八进制数 %x # 格式化无符号十六进制数 %x # 格式化无符号十六进制数(大写) %f # 格式化浮点数字,可指定小数点后的精度,比较常用 %e # 用科学计数法格式化浮点数 %e # 作用同%e,用科学计数法格式化浮点数 %g # %f和%e的简写 %g # %f 和 %e 的简写 %p # 用十六进制数格式化变量的地址
其中,%d 和 %f 可以指定整数与小数的位数:
in [87]: '%2d' % 345 out[87]: '345' in [88]: '%5d' % 345 out[88]: ' 345' in [89]: '%.2f' % 3.4567 out[89]: '3.46' in [90]: '%5.2f' % 345.5678 out[90]: '345.57'
使用 format :
python中还有另外一种字符串格式化方法 format,这也是python官方建议的方式
in [92]: 'i am {0} you are {1} he is {2}'.format('a','b','c') out[92]: 'i am a you are b he is c' in [93]: 'i am {0} you are {0} he is {2}'.format('a','b','c') out[93]: 'i am a you are a he is c' in [94]: 'i am {2} you are {0} he is {1}'.format('a','b','c') out[94]: 'i am c you are a he is b' in [96]: 'i am {name1} you are {name2} he is {name3}'.format(name1='a',name2='b',name3='c') out[96]: 'i am a you are b he is c' in [97]: 'i am {name1} you are {name2} he is {name3}'.format(name3='a',name2='b',name1='c') out[97]: 'i am c you are b he is a' # 懂了哇,弟弟们
8.字符串编码转换
上面说了一长串的编码,到这里来实际操作一下
使用 str.encode(编码方式) 进行编码:
in [98]: name_unicode = '小绵羊' in [99]: name_utf8 = name_unicode.encode('utf8') # 将unicode编码为utf8,默认为utf8,可以省略不写 in [100]: name_gbk = name_unicode.encode('gbk') # 将unicode编码为gbk in [101]: name_unicode out[101]: '小绵羊' in [102]: name_utf8 # 可以看到明显和gbk的编码方式不一样 out[102]: b'\xe5\xb0\x8f\xe7\xbb\xb5\xe7\xbe\x8a' in [103]: name_gbk out[103]: b'\xd0\xa1\xc3\xe0\xd1\xf2'
使用 str.decode(当前字符串编码) 解码成 unicode:
in [105]: name_utf8.decode('utf8') # 将utf8解码为unicode,括号里默认为utf8,可以省略不写 out[105]: '小绵羊' in [106]: name_gbk.decode('gbk') # 将gbk解码为unicode out[106]: '小绵羊'
9.字符串判断方法集合
如果仔细去看字符串的方法,发现有好多is开头的方法,这些方法其实都是判断方法,一起来看看哇:
in [107]: name = 'minutesheep' in [108]: name.isalnum() # 如果 string 至少有一个字符并且所有字符都是字母或数字则返回 true,否则返回 false out[108]: true in [109]: name.isalpha() # 如果 string 至少有一个字符并且所有字符都是字母则返回 true,否则返回 false out[109]: true in [110]: name.isdecimal() # 如果 string 只包含十进制数字则返回 true 否则返回 false. out[110]: false in [111]: name.isdigit() # 如果 string 只包含数字则返回 true 否则返回 false. out[111]: false in [112]: name.islower() # 如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 true,否则返回 false out[112]: false in [113]: name.isnumeric() # 如果 string 中只包含数字字符,则返回 true,否则返回 false out[113]: false in [114]: name.isspace() # 如果 string 中只包含空格,则返回 true,否则返回 false. out[114]: false in [115]: name.istitle() # 如果 string 是标题化的(见 title())则返回 true,否则返回 false out[115]: false in [116]: name.isupper() # 如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 true,否则返回 false out[116]: false
还有两个很重要的判断方法:
in [117]: name out[117]: 'minutesheep' in [119]: name.startswith('mi') # 判断开头,区分大小写 out[119]: false in [120]: name.startswith('mi') out[120]: true in [122]: name.endswith('ep') # 判断结尾,区分大小写 out[122]: true
10.字符串其他方法
in [123]: name = 'minutesheep' in [124]: name.capitalize() # 把字符串的第一个字符大写 out[124]: 'minutesheep' in [129]: name = 'minutesheep' in [130]: name.ljust(20) # 返回一个原字符串左对齐,并使用空格填充至长度20的新字符串 out[130]: 'minutesheep ' in [132]: name.rjust(20) # 返回一个原字符串右对齐,并使用空格填充至长度20的新字符串 out[132]: ' minutesheep' in [133]: name.lower() # 转换 string 中所有大写字符为小写. out[133]: 'minutesheep' in [134]: name = ' minutesheep ' in [135]: name.strip() # 截掉 string 两边边的空格 out[135]: 'minutesheep' in [136]: name.lstrip() # 截掉 string 左边的空格 out[136]: 'minutesheep ' in [137]: name.rstrip() # 截掉 string 右边的空格 out[137]: ' minutesheep' in [138]: max(name) # 返回字符串 str 中最大的字母。 out[138]: 'u' in [139]: min(name) # 返回字符串 str 中最小的字母。 out[139]: ' ' in [140]: name.replace(' ','-') # 把 string 中的 str1 替换成 str2,如果 num 指定,则替换不超过 num 次. out[140]: '-----minutesheep-----' in [141]: name.replace(' ','-',3) out[141]: '--- minutesheep ' in [142]: name = 'i am minutesheep' in [143]: name.split(' ') # 把string按照空格分割,默认为空格 out[143]: ['i', 'am', 'minutesheep'] in [144]: name.split() out[144]: ['i', 'am', 'minutesheep'] in [145]: name.swapcase() # 翻转 string 中的大小写 out[145]: 'i am minutesheep' in [146]: name.title() # 返回"标题化"的 string,就是说所有单词都是以大写开始,其余字母均为小写 out[146]: 'i am minutesheep' in [147]: name.upper() # 转换 string 中的小写字母为大写 out[147]: 'i am minutesheep'
至此,python字符串方法全部记录完,卒
下一篇: 漫画图片为你从新诠释男女爱情。