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。

参考文档: