官网文档地址:https://docs.python.org/3/library/stdtypes.html#string-methods
官网
公号:软测小生ruancexiaosheng
文档里的所有String的方法都在下面,基于 Python 3.X 版本,截止日期是2017/10/12日,之后的可能会有更新。花了一天的时间学习并记录了一下
4.7.1. String Methods
str.capitalize() --> String 返回字符串,其首字母大写,其余部分小写
1>>> str = "TEST"
2>>> str1= "test"
3>>> print(str + "-->" + str.capitalize() +'\n' + "-->" + str + str1.capitalize())
4 TEST-->Test
5 TEST-->Test
str.
casefold
() --> String 字符串转换成小写,用于不区分大小写的字符串比较
1>>> str = "TESTtest"
2>>> print(str.casefold())
3 testtest
str.
center
(width[, fillchar]) -->String 指定长度(此处是长度并不是索引值)填充字符
1>>> str = "Python"
2>>> print(str.center(7,'t'))
3>>> print(str.center(8,''))
4>>> print(str.center(9,''))
5>>> print(str.center(10,'X'))#
tPython
8Python8
99Python9
XXPythonXX
str.
count
(sub[, start[, end]]) --> int 查找某字符串(sub)出现的次数 ,也可以查找在某个位置范围 [2,6] 内出现子字符串的次数
>>>str = "Pythont"
>>>sub = "t"
>>>print(str.count(sub))#查找‘t’在“Pythont”中出现的次数
2
>>>print(str.count(sub,2,6))#在[2,6]范围 内出现的次数
1
str.
encode
(encoding="utf-8", errors="strict") --> Object 以指定的编码格式解码字符串。默认编码为字符串编码(适合python2中处理中文)
>>> str = "中文"
>>> sub = "test"
>>> print(str.encode(encoding='utf_8', errors='strict'))
b'\xe4\xb8\xad\xe6\x96\x87'
>>> print(sub.encode(encoding='utf_8', errors='strict'))
b'test'
str.
endswith
(suffix[, start[, end]]) --> Bool(True or False) 用于判断字符串是否以指定后缀结尾,如果以指定后缀结尾返回True,否则返回False。
可选参数"start"与"end"为检索字符串的开始与结束位置
1>>> str = "TestPython"
2>>> sub = "test"
3>>> print(str.endswith('on'))# 判断该字符串以指定后缀‘on’结尾
True
5>>> print(str.endswith("t",4,7))#判断4位置以‘t’开始,7位置以‘t’结尾
True
7>>> print(str.endswith("t",4,9))
False
str.
expandtabs
(tabsize=8) --> String 将字符串中的tab符号('\t')转换为空格,默认的空格数是8;tabsize -- 指定转换字符串中的 tab 符号('\t')转为空格的字符数。
>>> '01\t012\t0123\t01234'.expandtabs()
'01 012 0123 01234'
>>> '01\t012\t0123\t01234'.expandtabs(4)
'01 012 0123 01234'
str.
find
(sub[, start[, end]]) --> int 检测字符串中是否包含子字符串,如果指定 beg(开始)和 end(结束)范围,则检查是否包含在指定范围内,如果包含子字符串,则返回开始的索引值(下标,从0开始),否则返回-1。
str.r
find
(sub[, start[, end]]) --> int 返回字符串最后一次出现的位置,如果没有匹配项则返回-1。
>>> str = "TestPython"
>>> sub = "Test"
>>> print(str.find(sub))#检测是否包含子字符串sub,如果包含则返回开始的索引值,否则返回-1
0
>>> print(str.find('P'))
4
>>> print(str.find('A'))
-1
>>> s = 'lilin is good li lao ban'
>>> s.rfind('li')
14
>>> s.rfind('li',0,8)
2
注意:只有当你知道子字符串的位置时才是用find()方法。如果你需要检测子字符串是否包含,请至少用 in 运算符:
>>> 'Py' in 'Python'
True
str.
format
(*args, **kwargs) --> String 格式换字符串输出(方法与%相似,但可以指定顺序) 仔细阅读下面的例子
>>> str = "programmer"
>>> sub = "Python"
>>> print('I am a {}, and learn {}'.format(str,sub))
I am a programmer, and learn Python
>>> print('I am a {1}, and learn {0}'.format(str,sub))
I am a Python, and learn programmer
>>> print('I am a {name}, and learn {tool}'.format(name = str,tool = sub))
I am a programmer, and learn Python
str.
format_map
(mapping) --> String 执行字符串格式化操作,替换字段使用{}分隔,同str.format(**mapping), 除了直接使用mapping,而不复制到一个dict
>>> name = "Peter"
>>> country = "China"
>>> print('I\'m {name} and bron in {country}.'.format_map(vars()))
I'm Peter and bron in China. >>> str = "programmer"
>>> sub = "Python"
>>> print('I am a {str}, and learnning {sub}.'.format_map(vars()))
I am a programmer, and learn Python.
注: 此方法 出于 Python 3.2 之后
str.
index
(sub[, start[, end]]) --> int 检测字符串string中是否包含子字符串 sub,如果存在,则返回sub在string中的索引值(下标),如果指定began(开始)和 end(结束)范围,则检查是否包含在指定范围内,该方法与 python find()方法一样,只不过如果str不在 string中会报一个异常(ValueError: substring not found)。
>>> str = "programmer"
>>> print(str.index('m'))
6
>>> print(str.index('m',6,9))
6
>>> print(str.index('m',7,9))
7
字符串条件判断:
str.
isalnum
() --> Bool (True or False) 判断字符串String是否由字符串或数字组成,并且至少有一个字符(不为空)简而言之:只要 c.isalpha()
, c.isdecimal()
, c.isdigit()
, c.isnumeric()
中任意一个为真,则 c.isalnum()
为真。
'dobi'.isalnum()
# True
'dobi123'.isalnum()
# True
''.isalnum()
# True
'张'.isalnum()
# True
'dobi_123'.isalnum()
# False
'dobi 123'.isalnum()
# False
'%'.isalnum()
# False
str.
isalpha
() -->Bool (True or False) 判断字符串String是否只由字母组成,并且至少有一个字符(不为空)
'dobi'.isalpha()
# True
'do bi'.isalpha()
# False
'dobi123'.isalpha()
# False
'张'.isalpha()
# True
str.isdecimal()小数; str.isdigit()数字; str.isnumeric()数值 -->Bool (True or False) 判断字符串String是否只由小数/数字/数值组成,并且至少有一个字符(不为空)
三个方法的区别在于对 Unicode 通用标识的真值判断范围不同:isdecimal
: Nd, (小数) all decimals are digits, but not all digits are decimals(所有小数都是数字,但不是全部数字都是小数)isdigit
: No, Nd, (数字)isnumeric
: No, Nd, Nl (数值)digit
与 decimal
的区别在于有些数值字符串,是 digit
却非 decimal
,具体戳 这里
num = '\u2155'
print(num)
# ⅕
num.isdecimal(), num.isdigit(), num.isnumeric()
# (False, False, True)
num = '\u00B2'
print(num)
# ²
num.isdecimal(), num.isdigit(), num.isnumeric()
# (False, True, True)
num = "" #unicode
num.isdecimal(), num.isdigit(), num.isnumeric()
# (Ture, True, True)
num = "'Ⅶ'"
num.isdecimal(), num.isdigit(), num.isnumeric()
# (False, False, True)
num = "十"
num.isdecimal(), num.isdigit(), num.isnumeric()
# (False, False, True)
num = b"" # byte
num.isdigit() # True
num.isdecimal() # AttributeError 'bytes' object has no attribute 'isdecimal'
num.isnumeric() # AttributeError 'bytes' object has no attribute 'isnumeric'
str.
isidentifier
() -->Bool (True or False) 判断字符串中是否是有效标识符
'def'.isidentifier()
# True
'with'.isidentifier()
# True
'false'.isidentifier()
# True
'dobi_123'.isidentifier()
# True
'dobi 123'.isidentifier()
# False
''.isidentifier()
# False
str.
islower
() -->Bool (True or False) 判断字符串中是否是有效标识符
str = "programmer"
sub = "PYTHON"
print(str.islower())
# True
print(sub.islower())
# False
'ß'.islower() #德语大写字母
# False
str.
isprintable
() -->Bool (True or False) 判断字符串的所有字符都是可打印字符或字符串为空。Unicode 字符集中 “Other” “Separator” 类别的字符为不可打印的字符(但不包括 ASCII 的空格(0x20))。
'dobi123'.isprintable()
# True
'dobi123\n'.isprintable()
Out[24]: False
'dobi 123'.isprintable()
# True
'dobi.123'.isprintable()
# True
''.isprintable()
# True
str.
isspace
() -->Bool (True or False) 检测字符串是否只由空格组成,并且至少有一个字符(判断字符串中是否至少有一个字符,并且所有字符都是空白字符。)
'\r\n\t'.isspace()
#True
''.isspace()
#False
' '.isspace()
#True
str.
istitle
() -->Bool (True or False) 判断字符串中的字符是否是首字母大写,且其他字母为小写,其会忽视非字母字符
'How Python Works'.istitle()
# True
'How Python WORKS'.istitle()
# False
'how python works'.istitle()
# False
'How Python Works'.istitle()
# True
' '.istitle()
# False
''.istitle()
# False
'A'.istitle()
# True
'a'.istitle()
# False
'甩甩Abc Def 123'.istitle()
# True
str.
isupper
() -->Bool (True or False) 检测字符串中所有的字母是否都为大写
'张'.isupper()
# False
'DOBI'.isupper()
Out[41]: True
'Dobi'.isupper()
# False
'DOBI123'.isupper()
# True
'DOBI 123'.isupper()
# True
'DOBI\t 123'.isupper()
# True
'DOBI_123'.isupper()
# True
'_123'.isupper()
# False
字符串的联合与分割:
str.join(iterable) --> String 用指定的字符串,连接元素为字符串的可迭代对象。
'-'.join(['', '', ''])
# '2012-3-12'
'-'.join([2012, 3, 12])
# TypeError: sequence item 0: expected str instance, int found
'-'.join(['', '', b'']) #bytes 为非字符串
# TypeError: sequence item 2: expected str instance, bytes found
'-'.join([''])
# '2012'
'-'.join([])
# ''
'-'.join([None])
# TypeError: sequence item 0: expected str instance, NoneType found
'-'.join([''])
# ''
','.join({'dobi':'dog', 'polly':'bird'})
# 'dobi,polly'
','.join({'dobi':'dog', 'polly':'bird'}.values())
# 'dog,bird'
str.ljust(width[, fillchar]); str.rjust(width[, fillchar])
返回指定长度的字符串,字符串内容居左(右)如果长度小于字符串长度,则返回原始字符串,默认填充为 ASCII 空格,可指定填充的字符串。
width -- 指定填充指定字符后新字符串的总长度.
fillchar– 要填充的字符,默认为空格。
print('dobi'.ljust(10))
# 'dobi '
print('dobi'.ljust(10, '*'))
# 'dobi~~~~~~'
print('dobi'.ljust(3, '~'))
# 'dobi'
print('dobi'.ljust(3))
# 'dobi'
print('dobi'.rjust(10))
#' dobi'
print('dobi'.rjust(10,'@'))
#'@@@@@@dobi'
print('dobi'.rjust(3,'@'))
#'dobi'
print('dobi'.rjust(3))
#'dobi'
str.
lower
() -->String 字符串转换成小写 其仅对 ASCII
编码的字母有效。
print('PYTHON'.lower())
#'python'
print('Python'.lower())
#'python'
print('ß'.lower()) # 'ß' 为德语小写字母,其有另一种小写 'ss', lower 方法无法转换
#'ß'
print('张PYTHON'.lower())
#'张python'
str.lstrip([chars]); str.rstrip([chars]); str.strip([chars]) --> string or unicode
去掉(删除)字符串后面 / 前面/ 两边 的空格(默认是空格),或参数中的字符
print(' Python '.lstrip())
#'Python '
print('Test Python lstrip'.lstrip('Test'))#去掉前面的参数中的字符'Test'
#' Python lstrip'
print(' Python '.rstrip())
#' Python'
print(' Python '.strip())
#'Python'
static str.
maketrans
(x[, y[, z]]) str.translate(table)
maktrans
是一个静态方法,用于生成一个对照表,以供 translate
使用。
如果 maktrans
仅一个参数,则该参数必须是一个字典,字典的 key 要么是一个 Unicode 编码(一个整数),要么是一个长度为 1 的字符串,字典的 value 则可以是任意字符串、None
或者 Unicode 编码。
#注释:ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,
#它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,
#或者 Unicode 数值,如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常。 a = 'dobi'
ord('o')
# 111
ord('a')
# 97
hex(ord('狗'))
# '0x72d7'
b = {'d':'dobi', 111:' is ', 'b':97, 'i':' \u72d7\u72d7'}
table = str.maketrans(b)
print(a.translate(table))
如果 maktrans
有两个参数,则两个参数形成映射,且两个字符串必须是长度相等;如果有第三个参数,则第三个参数也必须是字符串,该字符串将自动映射到 None
:
a = 'dobi is a dog'
table = str.maketrans('dobi', 'alph')
a.translate(table)
# 'alph hs a alg'
table = str.maketrans('dobi', 'alph', 'o')
a.translate(table)
# 'aph hs a ag'
这里插一嘴:Python2.x和3.x下maketrans与translate函数使用上的不同
看一个简单的例子来说明字符串转换的过程:
2.X下的演示过程:
>>> import string #导入string模块
>>> map = string.maketrans('', 'abc') #建立映射表,将字符串中含有的'1','2','3'替换为'a','b','c'
>>> s = '' #转换前的字符串
>>> s.translate(map) #用创建的映射表map转换字符串
'54cbaabc789' #转换后的字符串
3.X下的演示过程:
>>> map = str.maketrans('','abc')
>>> s = ''
>>> s.translate(map)
'54cbaabc789'
2.X使用了string的maketrans函数,而3.X使用了str的maketrans函数,除了这一点,使用方法是基本相同的。若指定字符串中要删除的字符时,使用就会略有不同,如下:
2.X下的演示过程:
>>> import string
>>> map = string.maketrans('', 'abc')
>>> s = ''
>>> s.translate(map, '') #除了转换,还要删除字符串中的字符'7','8'
'54cbaabc9' #转换后的字符串没有字符'7','8'
3.X下的演示过程:
>>> map = str.maketrans('','abc', '')#要删除的字符需要在这指定
>>> s = ''
>>> s.translate(map)
'54cbaabc9'
str.
partition
(sep) --> (head, sep, tail) 根据指定的分隔符将字符串进行分割(返回一个3元的元组,第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串)
注:str.partition(sep) 是从前往后查找 (从左往右)
str.rpartition(sep) 是从后面开始查找 (从右往左)
str = 'learn Python is so easy'
print(str.partition('is'))
#('learn Python ', 'is', ' so easy')
print(str.partition('ii'))
#('learn Python is so easy', '', '')#如果字符串中没有'ii',将返回整个字符串作为第一个,分割的本身以及尾部为空
print(str.partition('learn'))
#('', 'learn', ' Python is so easy')
print(str.partition('easy'))
#('learn Python is so ', 'easy', '')
与 find()
rfind()
类似,不同的是如果找不到,就会引发 ValueError
。
str.index(sub[, start[, end]]); --> String 把字符串中的 old(旧字符串)替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。str.rindex(sub[, start[, end]]) --> String 返回子字符串 str 在字符串中最后出现的位置,如果没有匹配的字符串会报异常,你可以指定可选参数[beg:end]设置查找的区间。
str = 'this is replace old old old text'
print(str.replace('old', 'new'))
#this is replace new new new text
print(str.replace('old', 'new',1))#指定只替换几个
#this is replace new old old text
print(str.replace('old', 'new',2))
#this is replace new new old text
print(str.rindex('old',10,20))#查找最后出线的位置(下标)
#'16'
print(str.rindex('s',0,7))#
#'6'
str.
split
(sep=None, maxsplit=-1) --> list 通过指定分隔符对字符串进行切片,如果参数num有指定值,则仅分隔 num 个子字符串
str.
rsplit
(sep=None, maxsplit=-1) 从后往前
如果字符串开头/结尾包含空格字符串则以非空格字符串后的第一个空格为分隔符
print('1,2,3'.split(','), '1, 2, 3'.rsplit())#split从前往后; rsplit从后往前
#['1', '2', '3'] ['1,', '2,', '3'] #如果参数num有指定值,则仅分隔 num 个子字符串
print('1,2,3'.split(',', maxsplit=1), '1,2,3'.rsplit(',', maxsplit=1))#此处的意思就是仅分隔1次(最多分拆次数)
#['1', '2,3'] ['1,2', '3'] print('1 2 3'.split(), '1 2 3'.rsplit())#此处是以默认值分隔,默认值为空格
#['1', '2', '3'] ['1', '2', '3'] print('test test test'.split(maxsplit=1), '1 2 3'.rsplit(maxsplit=1))#此处直接写拆分次数,那么就是默认值(空格)分隔
#['test', 'test test'] ['1 2', '3'] print(' tttt test test '.split(), ' tttt test test '.rsplit())#如果字符串开头/结尾包含空格字符串则以非空格字符串后的第一个空格为分隔符
#['tttt', 'test', 'test'] ['tttt', 'test', 'test'] print('1,2,,,3,'.split(','), '1,2,,,3,'.rsplit(','))
#(['1', '2', '', '', '3', ''] ['1', '2', '', '', '3', '']) print(''.split())
#[] print(''.split('a'))
#[''] print('bcd'.split('a'))
#['bcd'] print('bcd'.split(None))
#['bcd']
str.
splitlines
([keepends]) --> List 字符串以换行符为分隔符拆分,去掉行界符;如果keepends为True,保留行界符,能被识别的行界符参照官方文档
print('HOW\nSOFT\nWORKS'.splitlines())#字符串以换行符为分隔符拆分,去掉换行符;
#['HOW', 'SOFT', 'WORKS']
print('HOW\nSOFT\nWORKS'.splitlines(True))#如果keepends为True,保留换行符
#['HOW\n', 'SOFT\n', 'WORKS'] print(''.splitlines(), ''.split('\n'))#注意两者的区别
#([] [''])
print("One line\n".splitlines(), "Two line\n".split('\n'))#注意两者的区别
#(['One line'] ['Two line', ''])
能被识别的行界符:
Representation | Description |
---|---|
\n |
Line Feed 换行 |
\r |
Carriage Return 回车 |
\r\n |
Carriage Return + Line Feed 回车+换行 |
\v or \x0b |
Line Tabulation |
\f or \x0c |
Form Feed 换页 |
\x1c |
File Separator 文件分隔符 |
\x1d |
Group Separator 组分隔符 |
\x1e |
Record Separator 记录分隔符号 |
\x85 |
Next Line (C1 Control Code) |
\u2028 |
Line Separator 行分隔符 |
\u2029 |
Paragraph Separator 段落分隔符号 |
str.
startswith
(prefix[, start[, end]]) --> Bool (true or false) 用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False。如果参数 beg 和 end指定值,则在指定范围内检查。
print('Learn python in cnblogs'.startswith('Learn'))
#True
print('Learn python in cnblogs'.startswith('test'))
#False
print('Learn python in cnblogs'.startswith('python',6,12))
#True
print('Learn python in cnblogs'.startswith('python',1,5))
#False
str.
swapcase
() -- > String 用于对字符串的大小写字母进行反转(小写转大写,大写转小写)
print('张Dobi a123 ß'.swapcase())#这里的 ß 被转成 SS 是一种大写
#张dOBI A123 SS
但需要注意的是 s.swapcase().swapcase() == s
不一定为真:
u'\xb5'
# 'µ'
u'\xb5'.swapcase()
# 'Μ'
u'\xb5'.swapcase().swapcase()
# 'μ'
hex(ord(u'\xb5'.swapcase().swapcase()))
Out[154]: '0x3bc'
这里 'Μ'
(是 mu 不是 M) 的小写正好与 'μ'
的写法一致。
str.
strip
([chars]) -->String 返回"标题化"的字符串,就是说所有单词都是以大写开始,其余字母均为小写。
print('learn python in cnblogs'.title())
#Learn Python In Cnblogs
str.upper() -->String 将字符串所有字母变为大写,会自动忽略不可转成大写的字符。
print('学习Python 1 day !!!'.upper())
#学习PYTHON 1 DAY !!!
str.zfill(width) --> String 用 '0' 填充字符串,并返回指定宽度的字符串。
注:正常一般是从字符串的左边开始填充,如指定长度小于字符串长度则返回原字符串
print('A'.zfill(5))
#0000A
print('--'.zfill(5))
#-000-
print('\'\''.zfill(5))
#000''
print('AAAAAAAAAAAA'.zfill(6))
#AAAAAAAAAAAA
print('AAAAAAAAAAAA'.zfill(15))
#000AAAAAAAAAAAA