Python 数据类型:字符串
字符串是一个字符的、有序的、不可变的序列,用于存储基于文本的信息。字符串所包含的字符存在从左至右的位置顺序,不可以在原处(in-place)修改。Python没有C语言的字符和字符串之分,只有字符串。从严格意义上说,字符串是单个字符的序列,支持基于位置的操作,能够通过位置索引字符;由于字符串具有不可变性,不能对原始的字符串进行修改,也就是说,不能通过对其某一位置进行赋值而修改字符串。
一,字符串常量
字符串常量使用成对的单引号或双引号来表示,两者表示的效果是一样的。
1,在字符串常量中表示引号
如果字符串中包含单引号,可以表示为"ab'cd",如果字符串中包含双引号,可以表示为'ab"cd',
2,转义字符
\是转义字符,用于表示具有特殊意义的字符,例如,\t 表示水平制表符,\v表示垂直制表符,\n 表示换行,\r表示回车。
要在字符串中表示\,可以在字符串中使用两个转义字符:"\\",也可以用转义字符来表示单引号或双引号:"ab'cd"等价于"ab\'cd",'ab"cd'等价于'ab\"cd'。
3,Raw字符串
Raw字符串抑制转义,字符串中的文本就是字面代表的意思,在字符串的引号前面加一个小写的r,表示该字符串是Raw字符串,关闭转义,常用于表示文件的路径:
myfilepath = r'C:\folder\text.dat'
r 表示非转义的原始字符串,对于转义字符,即 \加上对应的字母,表示特殊含义的字符,比如最常见的”\n”表示换行,”\t”表示Tab等,当字符串以r开头,说明字符串中都是普通的字符,即使字符串中出现“\n”,也表示一个反斜杠字符和一个字母n,而不是表示换行了。
4,多行文本
在一般情况下,字符串中的所有字符都必须出现在同一行。如果要编写多行文本,那么字符串必须以三个单引号开头,或三个双引号开头,称作三重引号,用于表示多行文本,每行文本之间嵌入换行符(\n):
>>> ms="""I
... am
... fine"""
>>> ms
'I\nam\nfine'
5,编码
u/U:表示unicode字符串,不是仅仅是针对中文, 可以针对任何的字符串,代表是对字符串进行unicode编码,建议所有编码方式采用utf8
二,字符串的索引和分片
因为字符串是字符的有序序列,所以,可以通过位置(称作索引)获得序列中的单个字符。在Python中,字符串中的单个字符可以通过索引来提取,索引是通过中括号[n]来指定的,n是偏移量,从0开始,最大值是字符串长度-1。
>>> s='abcd'
>>> s[0],s[1],s[2]
('a', 'b', 'c')
1,索引 s[i],获得特定偏移的单个字符
正向偏移量从0开始,最大值是字符串长度-1,偏移量还可以是负值,把负偏移看作是从结束处反向计数,最后一个元素的负偏移是-1。从技术上讲,一个负偏移与这个字符串的长度相加后得到这个字符串的正偏移。
索引(s[i])获取特定偏移的元素:
- 第一个元素的偏移位0
- 负偏移索引意味着从最后或右边反向进行计数
- s[0]获取第一个元素
- s[-2]获取了倒数第二个元素(就像s[len(s)-2]一样)
2,分片 s[i:j],获取字符串的一个子序列
分片是字符串的子串,使用冒号来分割偏移的上下限,分片的格式是:s[start : end],返回从start开始,到end结束(不包括end)的所有字符,分片操作符的含义是:
- start是开始索引,包括开始索引处的字符
- end是结束索引,不包括结束索引处的字符
- 分片返回start和end之间的所有字符
- start和end索引都可以省略,当省略start索引时,表示从0开始;当省略end索引时,表示到最后一个元素结束。
例如,返回字符串索引为0和1的字符:
>>> s='abcd'
>>> s[0:2]
'ab'
分片(s[i:j])提取对应的部分作为一个序列:
- 结束边界的字符并不包含在内
- 如果没有给出边界的值,边界默认的值为0和序列的长度,
- s[1:3]获取了从偏移位1的元素,直到但不包括偏移为3的元素。
- s[1:]获取了偏移为1直到末尾(偏移为序列长度)之间的元素。
- s[:3]获取了从偏移为0直到但是不包括偏移为3之间的元素。
- s[:-1]获取了从偏移为0直到但是不包括最后一个元素之间的元素。
- s[:]获取了从偏移为0到末尾之间的元素,这有效地实现完全的顶层的序列s的拷贝——一个有相同值得序列。
三,字符串的基本操作
1,字符串拼接
>>> 'abc'+'de' 'abcde'
2,字符串长度
>>> len('abc')
3
3,字符串重复
>>> 'abc'*3 'abcabcabc'
4,ASCII码和字符的转化
>>> ord('a')
97
>>> chr(97)
'a'
5,数字和字符的转化
>>> str(123)
'123'
>>> int('123')
123
>>> float('12.3')
12.3
四,常用的字符串函数
1,大小写转换
>>> s='Ab'
>>> s.lower()
'ab'
>>> s.upper()
'AB'
2,替换字符
s.replace(old,new[,count]),把字符串中的old字符串替换为new字符串,可以指定替换的数量count
>>> s='Ab'
>>> s.replace('A','N')
'Nb'
3,查找字符
s.find(sub[,start,end]),从s中查找sub字符串,如果存在返回sub第一个字符的索引,如果不存在,返回-1
>>> s='abcde'
>>> s.find('bc')
1
4,拆分字符串
s.split(sep,[maxsplit]),参数sep是分隔符,按照sep把字符串s拆分成列表,maxsplit指定最大的拆分次数
>>> s='a b c d'
>>> s.split(' ')
['a', 'b', 'c', 'd']
5,删除字符串两端的空格
s.strip()删除字符串两端的空格,s.lstrip()删除字符串左侧的空格,s.rstrip()删除字符串右侧的空格
>>> s=' ab cd '
>>> s.strip(),s.lstrip(),s.rstrip()
('ab cd', 'ab cd ', ' ab cd')
6,联结字符串
s.join(seq) ,参数seq是字符串列表,join函数的作用是以s作为分隔符,将 seq 中所有的元素合并为一个新的长字符串。
>>> s=('a','b','c')
>>> '-'.join(s)
'a-b-c'
>>> s=['a','b','c']
>>> '-'.join(s)
'a-b-c'
五,修改字符串
字符串是不可变的,不能在原处直接修改字符串,当基于已存在的字符串创建新的文本值时,可以通过list来实现:
>>> s='abcd'
>>> s=list(s)
>>> s
['a', 'b', 'c', 'd']
>>> s[3]='x'
>>> s=''.join(s)
>>> s
'abcx'
内置的list(str)函数,把字符串中的元素按照顺序创建为一个列表,列表项的顺序就是字符串中各个字符的顺序。
对list的各个列表项进行修改,按照使用''.join(list)函数,把列表项合并成字符串。
六,字符串的格式化方法调用
格式化方法调用是指调用format()函数对字符串进行格式化,使用主体字符串作为模板,接受任意多个format()的参数来替换模板中的占位符。
在主体字符串中,大括号通过位置{0},{1} 或关键字{key1},{key2}指出要替换的目标以及要插入的参数。
1,使用数字占位符
首先声明一个模板字符串template,{n}代表一个占位符,n是索引,从0开始;format()函数的参数用于替换模板template中的占位符
>>> template='{0},{1} and {2}'
>>> template.format('Jim','John','Vic')
'Jim,John and Vic'
2,使用关键字占位符
>>> template='{a},{b} and {c}'
>>> template.format(a='Jim',b='John',c='Vic')
'Jim,John and Vic'
附:python3.0+中的字符串方法
方法 | 描述 |
s. capitalize () |
将字符串的第一个字母变成大写,其他字母变小写。 |
s. center (width[, fillchar]) |
返回一个原字符串居中,并使用空格填充至长度 width 的新字符串。默认填充字符为空格。width -- 字符串的总宽度,fillchar -- 填充字符。 |
s. count (sub[, start[, end]]) |
统计字符串里某个字符出现的次数。可选参数为在字符串搜索的开始与结束位置。sub -- 搜索的子字符串,start -- 字符串开始搜索的位置。默认为第一个字符,第一个字符索引值为0,end -- 字符串中结束搜索的位置。字符中第一个字符的索引为 0。默认为字符串的最后一个位置。 |
s. encode (encoding="utf-8", errors="strict") |
返回转换编码后的字符串。参数s是要转换内容的对象;encoding -- 要使用的编码,如"UTF-8";errors -- 设置不同错误的处理方案。默认为 'strict',意为编码错误引起一个UnicodeError。 其他可能得值有 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' 以及通过 codecs.register_error() 注册的任何值。 |
s.decode(encoding='UTF-8', errors='strict') | 以 encoding 指定的编码格式解码字符串。默认编码为字符串编码。encoding -- 要使用的编码,如"UTF-8";errors -- 设置不同错误的处理方案。默认为 'strict',意为编码错误引起一个UnicodeError;其他可能得值有 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' 以及通过 codecs.register_error() 注册的任何值。 |
s. endswith (suffix[, start[, end]]) |
判断字符串是否以指定后缀结尾,如果以指定后缀结尾返回True,否则返回False。可选参数"start"与"end"为检索字符串的开始与结束位置。suffix -- 该参数可以是一个字符串或者是一个元素。start -- 字符串中的开始位置。end -- 字符中结束位置。 |
s.expandtabs(tabsize=8) | 把字符串中的 tab 符号('\t')转为空格,tab 符号('\t')默认的空格数是 8。tabsize -- 指定转换字符串中的 tab 符号('\t')转为空格的字符数。 |
s.find(str, beg=0, end=len(s)) | 检测字符串中是否包含子字符串str,如果指定beg(开始)和end(结束)范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回-1。str -- 指定检索的字符串,beg -- 开始索引,默认为0,end -- 结束索引,默认为字符串的长度。 |
s.index(str, beg=0, end=len(s)) | 检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,该方法与 python find()方法一样,只不过如果str不在 s中会报一个异常。str -- 指定检索的字符串。beg -- 开始索引,默认为0。end -- 结束索引,默认为字符串的长度。 |
s.isalnum() | 检测字符串是否由字母和数字组成。如果s至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False。 |
s.isalpha() | 检测字符串是否只由字母组成。如果字符串至少有一个字符并且所有字符都是字母则返回 True,否则返回 False。 |
s.isdecimal() | 检查字符串是否只包含十进制字符。这种方法只存在于unicode对象。注意:定义一个十进制字符串,只需要在字符串前添加 'u' 前缀即可。如果字符串是否只包含十进制字符返回True,否则返回False。 |
s.isdigit() | 检测字符串是否只由数字组成。如果字符串只包含数字则返回 True 否则返回 False。 |
s.islower() | 检测字符串是否由小写字母组成。如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False |
s.isnumeric() | 检测字符串是否只由数字组成。这种方法是只针对unicode对象。注:定义一个字符串为Unicode,只需要在字符串前添加 'u' 前缀即可。如果字符串中只包含数字字符,则返回 True,否则返回 False。 |
s.isspace() | 检测字符串是否只由空格组成。如果字符串中只包含空格,则返回 True,否则返回 False。 |
s.istitle() | 检测字符串中所有的单词拼写首字母是否为大写,且其他字母为小写。如果字符串中所有的单词拼写首字母是否为大写,且其他字母为小写则返回 True,否则返回 False. |
s.isupper() | 检测字符串中所有的字母是否都为大写。如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False |
s.join(seq) | 以 s作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串。 |
s.ljust(width) | 返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串。如果指定的长度小于原字符串的长度则返回原字符串。width -- 指定字符串长度。fillchar -- 填充字符,默认为空格。 |
s.lower() | 返回将字符串中所有大写字符转换为小写后生成的字符串。 |
s.lstrip([chars]) | 返回截掉字符串左边的空格或指定字符后生成的新字符串。chars --指定截取的字符,默认为空格。 |
string.maketrans(intab, outtab]) | 创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。注:两个字符串的长度必须相同,为一一对应的关系。返回字符串转换后生成的新字符串。通过from string import maketrans调用 |
max(s) | 返回字符串中最大的字母。 |
min(s) | 返回字符串中最小的字母。 |
s.partition(str) | 用来根据指定的分隔符将字符串进行分割。如果字符串包含指定的分隔符,则返回一个3元的元组,第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串。 |
s.replace(old, new[, max]) | 返回字符串中的 old(旧字符串) 替换成 new(新字符串)后生成的新字符串,如果指定第三个参数max,则替换不超过 max 次。old -- 将被替换的子字符串。new -- 新字符串,用于替换old子字符串。max -- 可选字符串, 替换不超过 max 次 |
s.rfind(str, beg=0,end=len(s) ) | 返回字符串最后一次出现的位置,如果没有匹配项则返回-1。str -- 查找的字符串。beg -- 开始查找的位置,默认为0。end -- 结束查找位置,默认为字符串的长度。 |
s.rindex( str, beg=0,end=len(s)) | 返回子字符串 str 在字符串中最后出现的位置,如果没有匹配的字符串会报异常,你可以指定可选参数[beg:end]设置查找的区间。str -- 查找的字符串。beg -- 开始查找的位置,默认为0。end -- 结束查找位置,默认为字符串的长度。 |
s.rjust(width[, fillchar]) | 返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串。如果指定的长度小于字符串的长度则返回原字符串。width -- 指定填充指定字符后中字符串的总长度。fillchar -- 填充的字符,默认为空格。 |
s.rpartition(str) | 类似于 partition()函数,不过是从右边开始查找。 |
s.rstrip([chars]) | 删除 string 字符串末尾的指定字符(默认为空格)。chars -- 指定删除的字符(默认为空格) |
s.split(str=""[, num]) | 通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串,返回分割后的字符串列表。str -- 分隔符,默认为空格。num -- 分割次数。 |
s.splitlines([keepends]) | 按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。keepends -- 在输出结果里是否去掉换行符('\r', '\r\n', \n'),默认为 False,不包含换行符,如果为 True,则保留换行符。 |
s.startswith(str,beg=0,end=len(string)) | 检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False。如果参数 beg 和 end 指定值,则在指定范围内检查。str -- 检测的字符串。beg -- 可选参数用于设置字符串检测的起始位置。end -- 可选参数用于设置字符串检测的结束位置。 |
s.strip([chars]) | 返回移除字符串头尾指定的字符(默认为空格换行等空字符)生成的新字符串。chars -- 移除字符串头尾指定的字符。 |
s.swapcase() | 返回大小写字母转换后生成的新字符串。 |
s.title() | 返回"标题化"的字符串,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())。 |
s.translate(table[, deletechars]) | 根据参数table给出的表(包含 256 个字符)转换字符串的字符, 要过滤掉的字符放到 del 参数中,返回翻译后的字符串。。able -- 翻译表,翻译表是通过maketrans方法转换而来。deletechars -- 字符串中要过滤的字符列表。 |
s.upper() | 返回小写字母转为大写字母的字符串。 |
s.zfill(width) | 返回指定长度的字符串,原字符串右对齐,前面填充0。width -- 指定需要返回字符串的长度。原字符串右对齐,前面填充0。 |
参考文档: