一篇关于python字符串方法详解的博客,come with me~
首先介绍一下一些序列型数据的知识:
序列型数据
- 字符串(str ''表示,不可变,有序)
- 元组(tuple “,”才是关键,不可变,有序)
- 列表(list []表示,可变,有序)
- 字节数据(bytes b’'表示,不可变)
这里详细补充可变与不可变:
首先不管是可变还是不可变的序列类型(1)分片必定产生新的序列(2)+号在等号右边即L=L+[i]必定产生新的序列,然后将新的序列地址赋予给等号左边的变量
对列表进行添加元素的方法总结
对于不可变变量来说,A+=B其实就等价于A=A+B,但是对于可变变量来说,A+=B是直接在原值的基础上做修改。
基本操作
len()、max()、min(),获取数据的长度、序列中元素最大、最小值,sum()获取列表或元组中元素之和
tip:min max返回的是值不是位置索引(区别于R)字节数据返回ASCII编码
索引访问操作
正向递增从0开始,反向递减从-1开始
tip:如果索引下标越界则IndexError;如果索引下标不是整数则TypeError。
切片操作
s[i:j] 或 s[i:j:k] 为基本形式,i省略从0开始,j省略直到结束,k省略默认为1,切片包括i不包含j
tip:下标是负数,如果截取范围内没有数据则返回空序列超过下标范围不报错。
连接/重复/成员关系操作
操作符及使用 | 描述 |
---|---|
x + y | 连接序列x和y |
n * x / x * n | 序列x复制n次 |
x in s | 如果x是s的子串返回True,否则False |
s.count(x) | 返回x在s中出现的次数 |
s.index([i,j] | 返回x在s的i到j(不包括j)中第一次出现的下标 |
比较运算操作
!=不等于、==等于、<=小于等于、>=大于等于
字符串比较ASCII编码(小写字母编码大于大写字母,小鬼不能当家,往后排)
排序操作
sorted(s,key=None,reverse=False)返回排序列表,reverse默认是升序,当为True时为倒序
内置函数all()&any()
all(s):如果s的所有值都为True,返回True;否则返回False
any(s):如果s的任意值为True,返回True;否则返回False
序列拆封
即赋值问题,变量个数和序列长度相等时:变量1,2,…,n = 序列或可迭代对象,使用*变量将多个值作为整体赋值给新变量
tip:不相等时ValueError;eg:first,*s,last = [1,2,3,4,5]去掉最大值和最小值
字符串
字符串或串(String)是由数字、字母、下划线组成的一串字符,是编程语言中表示文本的数据类型,是不可变的数据类型,通常用引号来创建字符串。由0个或多个字符组成的有序字符序列,一对单引号或双引号表示字符串,一对三单引号或三双引号表示多行字符串。
字符 | ASCII编码 | 十进制 |
---|---|---|
0-9 | 0011,0000-0011,1001 | 48-57 |
A-Z | 0100,0001-0101,1010 | 65-90 |
a-z | 0110,0001-0110,1010 | 97-122 |
符号 | 其余 |
比较字符ASCII编码大小
空格<数字<大写字母<小写字母
Unicode编码
统一字符编码,即覆盖几乎所有字符的编码方式
从0到1114111(0x10FFFF)空间,每个编码对应一个字符
python字符串中每个字符都是Unicode编码字符
函数及使用 | 描述 |
---|---|
chr(u) | x为Unicode编码,返回其对应字符 |
ord(x) | x为字符,返回其对应的Unicode编码 |
从python 3.0开始,字符串存储为Unicode,即字符串中的每个字符都由代码点表示。因此每个字符串只是一个Unicode代码点序列,用encode()函数将非编码字符串转换为python支持的任何编码。
字符串操作符
操作符及使用 | 描述 |
---|---|
x + y | 连接字符串x和y |
n * x / x * n | 字符串x复制n次 |
x in s | 如果x是s的子串返回True,否则False |
字符串类型的格式化
字符串格式化用于解决字符串和变量同时输出时的格式安排,将一个值插入到一个有字符串格式符%s的字符串中。值得注意的是双引号后面还要加一个%
print("%s is a %d years old boy." % ('Conan',7)
#Conan is a 7 years old boy.
format()方法的基本使用
<字符串{<参数序号>:<格式控制标记>)}>.format(<逗号分隔的参数>)
: | 填充 | 对齐 | 宽度 | , | <.精度> | 类型 |
---|---|---|---|---|---|---|
引号符号 | 用于填充的单个字符 | <左对齐 >右对齐 ^居中 | 输出宽度 | 用于整数和浮点数的千位分隔符 | 浮点数小数部分的精度或字符串的最大输出长度 | 整数类型b,c,d,o,x,X浮点数e,E,% |
<0:填充 对齐 宽度,.精度 类型>
- b:输出整数的二进制方式
- c:输出整数对应的Unicode字符
- d:输出整数的十进制方式
- o:输出整数的八进制方式
- x:输出整数的小写十六进制方式
- X:输出整数的大写十六进制方式
- e:输出浮点数对应的小写字母e的指数形式
- E:输出浮点数对应的大写字母E的指数形式
- f:输出浮点数的标准浮点形式
- s:输出格式化字符串
- p:用十六进制数格式化变量的地址
- %:输出浮点数的百分形式
字符串的特殊字符
- \转义符:表达特定字符的本意
- \b:退格
- \n:换行(光标移动到下行首)
- \r:回车(光标移动到本行首)
- \a:响铃
- \(在行尾时):续行符
- \:反斜杠符号
- ":双引号
- ':单引号
- \e:转义
- \000:空
- \v:纵向制表符
- \t:横向制表符
- \f:换页
- \o**:八进制数,**表示字符
- \x**:十六进制数,**表示字符
字符串的判断
函数 | 描述 | 函数 | 描述 |
---|---|---|---|
str.isdigit() | 是否全是数字 | str.isdecimal() | 是否只包含十进制数字字符 |
str.isalpha() | 是否全是字母 | str.isnumeric() | 是否只包含数字 |
str.isalnum() | 是否全是字母或数字 | str.islower() | 是否全部为小写 |
str.isupper() | 是否全是大写 | str.istitle() | 是否为标题,即各单词首字母大写,非首字母小写 |
str.isspace() | 是否是空白(仅包含空格、制表符、换行符等)字符 | str.isidentifier() | 是否满足标识符定义规则(只能是字母下划线开头) |
str.isprintable() | 是否是可打印字符(制表符、换行符不是,空格是) | str.isdecimal() | 是否由十进制字符组成 |
补充:
isdecimal函数,当是 Unicode数字、全角数字(双字节)为真, 罗马数字和汉字数字为假,为单字节数字时报错。
而isdigit函数, 如果是Unicode数字、byte数字(单字节)、全角数字(双字节)和罗马数字是为真, 只有汉字数字 为假。
对于isnumeric函数,Unicode数字、全角数字(双字节)、罗马数字和汉字数字 都是真,可是如果是byte数字则报错。
大家注意区分哦~
再补充一点:
istitle函数,即使首字母字符前面有非字母字符,如中文、数字、下划线等,也不影响对首字母字符的判断,但是每组必须第一个字母大写,后续字母小写,后续字母大写也会报错哦~
大小写转换
str.swapcase()大小写互换
str.capitalize()转换为首字母大写,其他小写
str.casefold()转换为大小写无关字符串比较的格式字符串,也是大写变小写,不过对象是Unicode
str.upper()全部大写
str.lower()全部小写,对象是ASCII
字符串的填充与对齐
str.center()字符串居中,返回一个用指定字符填充的字符串,默认是空格
str.ljust()默认空格填充在右边,返回一个空格填充的字符串,其原始字符串左对齐为总宽度
str.rjust()默认空格填充在左边,返回一个空格填充的字符串,其原始字符串右对齐为总宽度
str.zfill()前面补0
str.expandtabs()将字符串中的制表符扩展为若干个空格
字符串的修剪与扩展
str.strip([chars])
str.lstrip([chars])
str.rstrip([chars])
分别是移除左右两边、左边(即所有前导空格)、右边(即所有尾随空格)的字符chars,默认为移除空白(空格、制表符、换行符)
tip:chars可以是多字符,在移除时只要是这个序列的字符都会被移除
str.expandtabs([tabsize]):将字符串中的制表符扩展为多个空格,如果未提供参数tabsize则每个选项卡默认为8个空格
字符串的测试与查找
str.startswith(prefix,[start,end])
str.endwith(suffix,[start,end])
判断字符串str是否以prefix开头/是否以suffix(要检查的后缀的字符串或元组)结尾,start和end是搜索边界
str.count(sub,[start,end])返回字符串str中子串sub出现的次数
str.find(beg = 0, end = len(string))如果找到起始索引beg和结束索引则确定str是出现在字符串中还是字符串的子字符串,如果找到返回索引,否则返回-1
str.rfind(beg = 0, end = len(string))与find相同,只是从字符串右边开始查找
str.index(beg = 0, end = len(string))与find相同,只是如果未找到则引发异常
str.rindex(beg = 0, end = len(string))与index相同,只是从右边开始查找
Tip: find和index的区别是前者返回位置,如果找不到返回-1;后者没有找到抛出ValueError错误
字符串的替换
- s.replace(old,new,count)
将字符串的子串old替换new字符串,如果有count表示只替换前count个old子串;如果s中搜索不到子串old则不创建新字符串对象
字符串的拆分与组合
-
s.join(iterable)
将可迭代对象iterable中的元素使用s连接起来,iterable必须全部都是字符串类型,否则报错 -
s.splitines()
可以指定各种换行符,最常见的是\n,\r,\r\n如果指定keepends为true则保留所有的换行符 -
s.split()
后面指定数目表示分割几次,引号内内容表示按什么分割,不指定时自动分割默认按空格 -
s.partition(sep)
从左边第一个sep进行分割,最后返回一个包含3元素的元组,sep左边部分是元组的第一个元素,sep自身是元组的第二个元素,sep右边是元组的第三个元素。如果搜索不到sep,返回的3元组中,有两个元素是空,partition后两个元素是空,rpartition前两个是空。
补充:
字符串比较:
cmp(x,y)函数,如果x<y返回值是负数,x>y返回值是正数
字符串翻转:
通过步长来反转,[::-1]即将字符串一个一个倒着遍历