有人说过,编程有两件事,一件是处理数值,另一件是处理字符串。所以掌握字符串的用法尤为重要,所以接下来我们来说说 Python 中字符串的各种操作。、
在最开始,对于更好的编写多行的字符串,这里可以推荐一个小技巧给大家:
从输出结果可以看到,Python 遇到未闭合的小括号时,会自动将多行代码拼接在一起。相比使用 3 个连续的单(双)引号,这种方式不会将换行符和前面空格也当成字符串的一部分,在某些时候更加符合用户的习惯。
判断是否为字符串
也许你早就知道 Python 的字符串分为 str
和 unicode
两种,不过在 Python3 中已经简化为一种,就是 str
。但是,如果你还在使用 Python2,当你需要判断一个变量是否为字符串时,就需要注意了。这时,你判断变量 s
是否为字符串应该使用 isinstance(s, basestring)
。
从结果可以看到 str
和 unicode
是有区别的,而 basestring
包含了两者。因此要正确判断一个变量是不是字符串,应该使用 isinstance(s,basestring)
,因为 basestring
才是是 str
和 unicode
的基类,包含了普通字符串和unicode类型。
性质判断
# str 为字符串变量
str.isalnum() # 检测字符串是否只由字母和数字组成
str.isalpha() # 检测字符串是否只由字母组成
str.isdigit() # 检测字符串是否只由数字组成
str.islower() # 检测字符串是否全小写
str.isupper() # 检查字符串是否全大写
str.isspace() # 检测字符串是否只由空白字符组成
str.istitle() # 检测字符串中所有的单词拼写首字母是否为大写,且其他字母为小写
str.startswith(substr, beg=0,end=len(string))
str.endswith(suffix[, start[, end]])
# str -- 检测的字符串。
# substr -- 指定的子字符串。
# strbeg -- 可选参数用于设置字符串检测的起始位置。
# strend -- 可选参数用于设置字符串检测的结束位置。
另外,自Python 2.5版本起,*with()
函数族的prefix参数可以接受 tuple 类型的实参,当实参中的某个元素能够匹配时,即返回 True
。
查找与替换
str.count(sub, start= 0,end=len(string)) # 该方法返回子字符串在字符串中出现的次数。
# sub -- 搜索的子字符串
# start -- 字符串开始搜索的位置。默认为第一个字符,第一个字符索引值为0。
# end -- 字符串中结束搜索的位置。字符中第一个字符的索引为 0。默认为字符串的最后一个位置。
str.find(str, beg=0, end=len(string)) # 则检查是否包含在指定范围内,如果指定范围内如果包含指定索引值,返回的是索引值在字符串中的起始位置。如果不包含索引值,返回-1。
str.rfind(str, beg=0 end=len(string)) # 返回字符串最后一次出现的位置,如果没有匹配项则返回-1。
str.index(str, beg=0, end=len(string)) # 该方法与 python find()方法一样,只不过如果str不在 string中会报一个异常。
str.rindex(str, beg=0 end=len(string)) # 返回子字符串 str 在字符串中最后出现的位置,如果没有匹配的字符串会报异常。
# str -- 指定检索的字符串
# beg -- 开始索引,默认为0。
# end -- 结束索引,默认为字符串的长度。
其中 count()
能够查找子串 sub
在字符串中出现的次数,这个数值在调用 replace
方法的时候用得着。此外,需要注意 find()
和 index()
方法的不同:find()
函数族找不到时返回 -1
,index()
函数族则抛出 ValueError
异常。但对于判定是否包含子串的判定并不推荐调用这些方法,而是推荐使用 in
和 not in
操作符。
str.replace(old, new[, max])
# 返回字符串中的 old(旧字符串) 替换成 new(新字符串)后生成的新字符串,
# 如果指定第三个参数max,则替换不超过 max 次。
如果不指定 max
,就全部替换。
切分和连接
str.partition(str) # 返回一个3元的元组,第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串。
str.rpartition(str) # 作用和 partiton 一样,不过该方法从末尾搜索
str.splitlines([keepends])
# 按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表,
# 如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。
str.split(str="", num=string.count(str)) # 返回分割后的字符串列表。
str.rsplit([sep=None][,count=str.count(sep)]) # 类似 split,从末尾fenge
# str -- 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
# num -- 分割次数。默认为 -1, 即分隔所有。
别看这些方法好像很多,其实只要弄清楚 partition()
和 split()
就可以了。
split()
有不少小陷阱,需要注意,比如对于字符串 s
、s.split()
和 s.split(' ')
的返回值是不相同的。
产生差异的原因在于:当忽略分割符参数或参数为None时与明确给参数赋予字符串值时,split()
采用两种不同的算法。对于前者,split()
先去除字符串两端的空白符,然后以任意长度的空白符串作为界定符分切字符串(即连续的空白符串被当作单一的空白符看待);对于后者则认为两个连续的分割符之间存在一个空字符串。因此对于空字符串(或空白符串),它们的返回值也是不同的。
字符串变形
str.lower() # 转换字符串中所有大写字符为小写。
str.upper() # 将字符串中的小写字母转为大写字母。
str.capitalize() # 将字符串的第一个字母变成大写,其他字母变小写。
str.swapcase() # 返回大小写字母转换后生成的新字符串。
str.title() # 返回"标题化"的字符串,就是说所有单词都是以大写开始。
因为 title()
函数并不去除字符串两端的空白符也不会把连续的空白符替换为一个空格,所以不能把 title()
理解先以空白符分切字符串,然后调用 capitalize()
处理每个字词以使其首字母大写,再用空格将它们连接在一起。如果你有这样的需求,建议使用 string
模块中的 capwords(s)
函数,它能够去除两端的空白符,再将连续的空白符用一个空格代替。
删除与填充
删减在文本处理是很常用,我们常常得把字符串掐头去尾,就用得上它们。
str.strip([chars]) # 返回移除字符串头尾指定的字符生成的新字符串。
str.lstrip([chars]) # 返回截掉字符串左边的空格或指定字符后生成的新字符串。
str.rstrip([chars]) # 返回删除 string 字符串末尾的指定字符后生成的新字符串。
# chars -- 指定删除的字符(默认为空格)
填充则常用于字符串的输出,借助它们能够排出漂亮的版面。
str.center(width[, fillchar]) # 该方法返回一个原字符串居中,并使用空格填充至长度 width 的新字符串。
str.ljust(width[, fillchar]) # 返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串。如果指定的长度小于原字符串的长度则返回原字符串。
str.rjust(width[, fillchar]) # 返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串。如果指定的长度小于字符串的长度则返回原字符串。
# width -- 字符串的总宽度。
# fillchar -- 填充字符(默认填充空格)。
str.zfill(width) # 返回指定长度的字符串,原字符串右对齐,前面填充0。width -- 指定字符串的长度。
str.expandtabs(tabsize=8) # 法把字符串中的 tab 符号('\t')转为空格,tab 符号('\t')默认的空格数是 8
# tabsize -- 指定转换字符串中的 tab 符号('\t')转为空格的字符数。