目录
常见字符串常量和表达式
操作 | 解释 |
---|---|
s = ” | 空字符串 |
s = “Tom’s” | 双引号和单引号的使用 |
s = ‘s\np\ta\x00m’ | 转义序列 |
s = “””…””” | 三重引号字符串块 |
s = r’\temp\spam’ | Raw字符串 |
s = b’Tom’ | Python3中的字节字符串 |
s = u’Tom’ | 仅在python2.6中使用的Unicode字符串 |
s1 + s2 s * 3 | 合并 重复 |
s[i] s[i:j] len(s) | 索引 分片 求长度 |
“a %s parrot”%kind | 字符串格式化表达式 |
“a {0} parrot”.format(kind) | 字符串格式化方法 |
s.find(‘pa’) | 字符串方法调用:搜索 |
s.rstrip() | 移除空格 |
s.replac e(‘pa’,’xx’) | 替换 |
s.split(‘,’) | 用展位符分隔 |
s.isdigit() | 内容测试 |
s.lower() | 短信息转换 |
s.endswith(‘spam’) | 结束测试 |
‘spam’.join(strlist) | 插入分隔符 |
s.encode(‘latin-1’) | Unicode编码等 |
for i in s:print(i) ‘spam’ in s [c * 2 for c in s] map(ord,s) | 迭代,成员关系 |
字符串形式
字符串常量
- 单引号(注意引号为英文状态下的)
‘hello’ - 双引号
“Tom’s” - 三引号
包括多行字符串常量(块字符串);也可作为多行注释;
”’
Hello
world
”’ - 转义字符
“s\tp\na\om” - Raw字符串
r”C:\home\admin” - Python3中的Byte字符串
b”sp\x01am” - 仅在Python2.6中使用的Unicode字符串
u”eggs\u0020spam”
原始(raw)字符串常量
抑制转义机制。
s = r'hello\world'
print(s)
hello\world
注意:一个raw字符串不能以奇数个反斜杠结束。最后一个反斜杠会转义后续引用的字符,帮最后一个转义字符将引号转义了。如果需要使用单个反斜杠结果的字符,可以使用以下形式。
r'\root'+'\\'
转义字符
转义字符 | 描述 |
---|---|
\newline | 忽视(连续) |
\\ | 反斜杠符号 |
\’ | 单引号 |
\” | 双引号 |
\a | 响铃 |
\b | 退格(Backspace) |
\e | 转义 |
\000 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
\oyy | 八进制数,yy代表的字符,例如:\o12代表换行 |
\xyy | 十六进制数,yy代表的字符,例如:\x0a代表换行 |
\N{id} | Unicode数据库ID |
\uhhhh | Unicode16位的十六进制值 |
\Uhhhhhhhh | Unicode32位的十六进制值 |
\0 | Null(不是字符串结尾) |
\other | 其它的字符以普通格式输出 |
格式化字符串
基本概念
%[(name)][flags][width][.precision]typecode
字符串格式化符号:
符 号 | 描述 |
---|---|
%c | 格式化字符及其ASCII码 |
%s | 格式化字符串 |
%d | 格式化整数 |
%u | 格式化无符号整型 |
%o | 格式化无符号八进制数 |
%x | 格式化无符号十六进制数 |
%X | 格式化无符号十六进制数(大写) |
%f | 格式化浮点数字,可指定小数点后的精度 |
%e | 用科学计数法格式化浮点数 |
%E | 作用同%e,用科学计数法格式化浮点数 |
%g | %f和%e的简写 |
%G | %f 和 %E 的简写 |
%p | 用十六进制数格式化变量的地址 |
格式化操作符辅助指令:
符号 | 功能 |
---|---|
* | 定义宽度或者小数点精度 |
– | 用做左对齐 |
+ | 在正数前面显示加号( + ) |
<sp> | 在正数前面显示空格 |
# | 在八进制数前面显示零(‘0′),在十六进制前面显示’0x’或者’0X'(取决于用的是’x’还是’X’) |
0 | 显示的数字前面填充’0’而不是默认的空格 |
% | ‘%%’输出一个单一的’%’ |
(var) | 映射变量(字典参数) |
m.n. | m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话) |
可以参考内置函数print()
基于字典的字符串格式化
可以通过字典将值传入格式化字符
s = "%(name)s %(age)d"%{'name':'Tom','age':18}
print(s)
Tom 18
字符串格式化调用方法(format())
语法
replacement_field ::= “{” [field_name] [“!” conversion] [“:” format_spec] “}”
field_name ::= arg_name (“.” attribute_name | “[” element_index “]”)*
arg_name ::= [identifier | integer]
attribute_name ::= identifier
element_index ::= integer | index_string
index_string ::= <any source character except “]”> +
conversion ::= “r” | “s” | “a”
format_spec ::= <described in the next p>
template1 = '{0},{1} and {2}'
template2 = '{motto},{pork} and {food}'
template3 = '{motto},{0} and {food}'
t1 = template1.format('spam','ham','eggs')
t2 = template2.format(motto='spam',pork='ham',food='egges')
t3 = template3.format('ham',motto='spam',food='eggs')
print(t1)
print(t2)
print(t3)
spam,ham and eggs
spam,ham and egges
spam,ham and eggs
添加键、属性和偏移量
格式化字符串可以指定对象属性和字典键。
import sys
t = "I'm using a {0.platform} computer.".format(sys)
d = {'name':'Tom','age':18}
t2 = "{0[name]} is {0[age]} years old.".format(d)
l = [1,2,3]
t3 = '{0[0]},{0[2]}'.format(l)
print(t)
print(t2)
print(t3)
I'm using a darwin computer.
Tom is 18 years old.
1,3
添加具体格式化
可以在格式化字符串中添加额外的语法来实现具体的层级,如字段大小、对齐方式各特定类型编码,具体格式如下:
{fieldname!conversionflag:formatspec}
- fieldname:指定参数的一个数字或关键字,后面跟着可选的“.name”或“[index]”。
- conversionflag:可以是r,s或a,分别表示repr,str,ascii内置函数的一次调用。
- formatspec:指定如何表示该值,包括字段宽带、对方方式、补零、小数点精度等细节,并且以一个可选的数据类型编码结束。
formatspec格式
format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]
fill ::= <any character>
align ::= ”<” | “>” | “=” | “^”
sign ::= ”+” | “-” | ” “
width ::= integer
precision ::= integer
type ::= ”b” | “c” | “d” | “e” | “E” | “f” | “F” | “g” | “G” | “n” | “o” | “s” | “x” | “X” | “%”
如果指定了一个有效的 align 值,则可以在该值前面加一个 fill 字符,它可以为任意字符,如果省略则默认为 空格符。在 格式化字符串字面值或在使用str.format() 方法时是无法使用花括号字面值 (”{” or ”}”) 作为fill 字符的。但是,通过嵌套替换字段插入花括号则是可以的。这个限制不会影响format() 函数。 各种对齐选项的含义如下:
选项 | 含义 |
‘<‘ | 强制字段在可用空间内左对齐(这是大多数对象的默认值)。 |
‘>’ | 强制字段在可用空间内右对齐(这是数字的默认值)。 |
‘=’ | 强制将填充放置在符号(如果有)之后但在数字之前。这用于以“+000000120”形式打印字段。此对齐选项仅对数字类型有效。当’0’ 紧接在字段宽度之前时,它成为默认值。 |
‘^’ | 强制字段在可用空间内居中。 |
sign 选项仅对数字类型有效,可以是以下之一:
选项 | 含义 |
‘+’ | 表示标志应该用于正数和负数。 |
‘-‘ | 表示标志应仅用于负数(这是默认行为)。 |
space | 表示应在正数上使用前导空格,在负数上使用减号。 |
%与format()比较
序列的特性
[su_accordion class=””][su_spoiler title=支持索引 open=”no” style=”default” icon=”plus” anchor=”” class=””]
s = 'hello'
s[1]
s[2]
[/su_spoiler][su_spoiler title=支持反向索引 open=”no” style=”default” icon=”plus” anchor=”” class=””]
s = 'hello'
s[-1]
[/su_spoiler][su_spoiler title=分片 open=”no” style=”default” icon=”plus” anchor=”” class=””]
s = "There is Ethan's blog."
print(s[9:])
[/su_spoiler][su_spoiler title=使用符号进行合并 open=”no” style=”default” icon=”plus” anchor=”” class=””]
s1 = "There is "
s2 = "Ethan's blog"
s = s1 + s2
print(s)
t = 'abc'
print(t * 3)
There is Ethan's blog
abcabcabc
[/su_spoiler][/su_accordion]
分片
当使用一对冒号分隔的偏移来索引字符串这样的序列对象时,Python将返回一个新的对象。
左边的偏移量为下边界,右边的偏移量为上边界。
Python将获取从下边界直到上边界但不包含上边界的所有元素,并返回一个包含了所有元素的新的对象。
当上边界或下边界没有给出时表示:
下边界没有给出表示从一个元素开始,上边界没有给出,表示直到最后一个元素,最后一个元素包含在内。
s = 'abcdef'
print(s[:2])
print(s[1:])
ab
bcdef
扩展分片:第三个限制值
第三个索引值,用作步进(stride)。
X[I:J:K]表示“索引X对象中的元素,从偏移为I直到偏移为J-1,第隔K个元素索引一次”。
s = 'abcdefghijk'
s[::2] #取偶数位
s[::-1] #逆序
不可变性
字符串在Python中具有不可变性,在创建后就不可以改变。
但是可以通过建立一个新的字符串来对其赋值进行改变。
#这是一个错误的示范
s = 'bbcdef'
s[0] = 'a'
s = 'hello'
s = s + 'world'
这个时候可能觉得每次需要修改时,就要创建一个新的对象,效率低下。但是,事实并非如此,Python在运行的过程中对不再使用的字符串对象自动进制垃圾收集(回收空间),所以新的对象占用了在前边的值所占用的空间(即原来的对象)。
注意
如果你不得不对一个越长的字符串进行许多修改,为了优化脚本的性能,最好将字符串转换为一个可以原地修改的对象。
s = 'hello'
l = list(s)
可以用join()方法将列表“合并”成一个字符串
''.join(l)
字符串方法
capitalize() | center() | count() | encode() |
endswith() | expandtabs() | find() | format() |
index() | isalnum() | isalpha() | isdecimal() |
isdigit() | isidentifier() | islower() | isnumeric() |
ljust() | lower() | lstrip() | maketrans() |
partition() | replace() | rfind() | rindex() |
rjust() | rpartition() | rsplit() | rstrip() |
split() | splitlines() | startswith() | strip() |
isprintable() | isspace() | istitle() | isupper() |
join() | swapcase() | title() | translate() |
upper() | zfill() |
find()
语法
find(sub[, start [, end ]])
作用
返回子字符串 sub 在 s[start:end] 切片内被找到的最小索引。可选参数 start 与 end 会被解读为切片 表示法。如果 sub 未被找到则返回 -1。
注意
find() 方法应该只在你需要知道 sub 所在位置时使用。要检查 sub 是否为子字符串,请使用 in 操作符:
'Py' in 'Python'
rstrip()
语法
作用
replace()
语法
replace(old, new[, count])
作用
返回字符串的副本,其中出现的所有子字符串 old 都将被替换为 new。如果给出了可选参数 count,则 只替换前 count 次出现。
注意
replace()返回了一个新的对象,并不是在原地修改。
split()
语法
split(sep=None, maxsplit=-1)
- maxsplit:最大拆分次数
- sep:指定分隔符
作用
返回一个由字符串内单词组成的列表, 使用 sep 作为分隔字符串。 如果给出了 maxsplit, 则最多进行 maxsplit 次拆分(因此,列表最多会有 maxsplit+1 个元素)。如果 maxsplit 未指定或为 -1,则不限制拆分次数(进行所有可能的拆分)。
如果给出了sep,则连续的分隔符不会被组合在一起而是被视为分隔空字符串(例如’1,,2′.split(‘,’)将返回[‘1′,”,’2′])。sep参数可能由多个字符组成(例如’1<>2<>3’.split(‘<>’)将返回[‘1′,’2′,’3’])。使用指定的分隔符拆分空字符串将返回[”]。
如果 sep 未指定或为 None,则会应用另一种拆分算法:连续的空格会被视为单个分隔符,其结果将不包含开头或末尾的空字符串,如果字符串包含前缀或后缀空格的话。因此,使用 None 拆分空字符串或仅包含空格的字符串将返回 []。
isdigit()
语法
作用
lower()
语法
作用
endswith()
语法
作用
join()
语法
join(iterable)
作用
返回一个由 iterable 中的字符串拼接而成的字符串。如果 iterable 中存在任何非字符串值包括bytes 对象则会引发TypeError。调用该方法的字符串将作为元素之间的分隔。
encode()
语法
作用
rsplit()
语法
rsplit(sep=None, maxsplit=-1)
作用
返回一个由字符串内单词组成的列表, 使用 sep 作为分隔字符串。 如果给出了 maxsplit, 则最多进行 maxsplit 次拆分, 从 最右边开始。如果 sep 未指定或为 None,任何空白字符串都会被作为分隔符。除 了从右边开始拆分,rsplit() 的其他行为都类似于split()。