字符串
字符串的基本特点
本质:字符序列。python里的字符串是不可变的,我们无法对原字符串做任何修改。但是可以将字符串的一部分复制到新创建的字符串,达到“看起来修改”的效果。
python不支持单字符类型,单字符也是作为一个字符串使用的。
字符串的编码
Unicode。
使用内置函数ord()可以把字符转换成Unicode码;
使用内置函数chr()可以把十进制数字转换成对应的字符。
>>>ord('A')
65
>>>ord('高')
39640
>>>chr(66)
'B'
>>>ord('手')
25163
创建字符串
单双引号均可,可以创建本身带有引号的字符而不适用转义字符。
a='abc'
b='sys'
c="I'm a teacher!"
d='My name is "Laiii"'
连续三个单引号可以创建多行字符串。
resume='''name="Laiii"
company="sys" age=18
lover="Nobody"'''
空字符串与len()函数
>>>c=''
>>>len(c)
0
#空字符串不包含任何字符且长度为0
>>>len('Laiii很好看')
8
#len用于计算字符串里含有多少字符
转义字符
转移字符 | 描述 |
---|---|
\(在行尾时) | 续行符 |
\ | 反斜杠符号 |
’ | 单引号 |
" | 双引号 |
\b | 退格(backspace) |
\n | 换行 |
\t | 横向制表符 |
\r | 回车 |
退格
退格只是光标向前移动了一个字符,并不是删除一个字符,这个位置的字符在操作之后依然存在。
'\b’退格不是删除了一个字符,只是将光标向前移动了一个位置,此位置的字符仍然存在。
后面的字符能够覆盖这个位置的字符,是因为当退格后,光标位置显示‘‘press any key to continue’,光标等待接下来的操作,而后面输出来的字符就会从此处打印到屏幕显示出来的样子就像是删除了一个字符。
‘\b’不能和换行符一起使用,是因为’\b’退格后光标覆盖了此处的字符后,若换行则光标处的字符就显示了出来,所以并没有退了一个字符的效果。
引自https://www.cnblogs.com/Mendy/p/11563379.html
字符串的拼接
两个对象相加,形成新的对象。
字符串+字符串,则为拼接
>>>'aa'+'bb'
'aabb'
没有加号也可以
>>>'aa''bb'
'aabb'
数字+数字,则为加法运算
>>>3+4
7
类型不同相加,抛出异常
字符串的复制
>>>a='Laiii'*3
LaiiiLaiiiLaiii
不换行打印
print("Laiii",end=' ')
print("Laiii",end='##')
print("Laiii")
#运行结果Laiii Laiii##Laiii
从控制台获取字符串
>>>myname = input("请输入名字:")
请输入名字:Laiii
>>>myname
'Laiii'
str()实现数字转型字符串
>>>str(5.20)
'5.20'
>>>str(3.14e2)
'314.0'
>>>str(True)
'True'
使用[]提取字符
正向搜索:[0]到[len(str)-1]
反向搜索:[-1]到[-len(str)]
>>>a='laikeyu'
>>>a[0]
'l'
>>>a[-1]
'u'
#replace()实现字符串的替换
字符串不可改变,用这个方法可以创建一个替换后的新字符串。然后a指向了新的字符串,旧的字符串内存被释放。
>>> a = 'abcdefghijklmnopqrstuvwxyz'
>>> a
'abcdefghijklmnopqrstuvwxyz'
>>> a = a.replace('c','高')
'ab 高 defghijklmnopqrstuvwxy'
字符串的切片slice操作
格式
[起始偏移量 start:终止偏移量 end:步长]
包头不包尾:包含起始偏移量,不包含终止偏移量。
步长为1:一个一个取
步长为2:隔一个取一个
操作和说明 | 示例 | 结果 |
---|---|---|
[:] 提取整个字符串 | “abcdef”[:] | abcdef” |
[start:]从 start 索引开始到结尾 | “abcdef”[2:] | “cdef” |
[:end]从头开始直到end-1 | “abcdef”[:2] | “ab” |
[start:end]从 start 到 end-1 | “abcdef”[2:4] | “cd” |
[start:end:step]从 start 提取到end-1,步长是 step | “abcdef”[1:5:2] | “bd” |
三个量为负数时
示例 | 说明 | 结果 |
---|---|---|
“abcdefghijklmnopqrstuvwxyz”[-3:] | 倒数三个 | “xyz” |
“abcdefghijklmnopqrstuvwxyz”[-8:-3] | 倒数第八个到倒数第三个(包头不包尾) | ‘stuvw’ |
“abcdefghijklmnopqrstuvwxyz”[::-1] | 步长为负,从右到左 反向提取 | ‘zyxwvutsrqponmlkjihgfedcba’ |
切片操作起始终止偏移量超了范围,会取到最开始或者最结尾而不报错。
字符串的分割split()和合并join()
spilt()可以基于制定分隔符将字符串分割成多个子字符串储存到列表中
>>>a="to be or not to be"
>>>a.split()
['to','be','or','not','to','be']
#spilt()若不指定分隔符,则默认使用空白字符(换行符、空白符、制表符)
>>>a="to be or not to be"
>>>a.split('be')
['to','or not to','']
#最后有个空字符串
join()用于将列表里的一系列子字符串连接起来。
>>> a = ['td','td100','td200']
>>> '*'.join(a)
'td*td100*td200'
涉及性能的迭代连续拼接操作的时候建议将要拼接的对象迭代放入列表里,然后用join()函数来拼接字符串,而不是使用+(+每次迭代都将生成一个字符串)。
join 函数在拼接字符串之前会计算所有字符串的长度,然后逐一拷贝,仅新建一次对象。
字符串驻留机制
对于符合标识符规则的字符串(仅包含下划线、字母、和数字)的字符串会启用字符串驻留机制,也即仅保存一份相同且不可变的字符串。
>> a = "abd_33"
>>> b = "abd_33"
>>> a is b
True
#a和b都指向同一个对象
>>> c = "dd#"
>>> d = "dd#"
>>> c is d
False
#c和d不指向同一个对象,但是值相等
>>> str1 = "aa"
>>> str2 = "bb"
>>> str1+str2 is "aabb"
字符串的比较和同一性
is 比较id
==比较value
成员操作符
in/not in 判断某个字符串(子字符串)是否存在于字符串中。
字符串常用方法汇总
常用查找方法
方法和使用示例 | 说明 | 结果 |
---|---|---|
len(a) | 字符串长度 | 96 |
a.startswith(‘我是高淇’) | 判断是否以指定字符串开头 | True |
a.endswith(‘过我’) | 判断是否以指定字符串结尾 | True |
a.find(‘高’) | 第一次出现指定字符串的位置 | 2 (从0开始) |
a.rfind(‘高’) | 最后一次出现指定字符串的位置 | 29 |
a.count(“编程”) | 指定字符串出现了几次 | 3 |
a.isalnum() | 所有字符全是字母或数字 | False |
去除首尾信息
>>> "*s*x*t*".strip("*")
's*x*t'
#去除首尾‘*’
>>> "*s*x*t*".lstrip("*")
's*x*t*'
#去除左边‘*’
>>> "*s*x*t*".rstrip("*")
'*s*x*t'
#去除右边‘*’
>>> " sxt ".strip()
'sxt'
#去除首尾空格
大小写转换
示例 | 说明 |
---|---|
a.capitalize() | 产生新的字符串,首字母大写 |
a.title() | 产生新的字符串,每个单词都首字母大写 |
a.upper() | 产生新的字符串,所有字符全转成大写 |
a.lower() | 产生新的字符串,所有字符全转成小写 |
a.swapcase() | 产生新的,所有字母大小写转换 |
格式排版
center()
>>> a="SXT"
>>> a.center(10,"*")
'***SXT****'
>>> a.center(10)
' SXT '
ljust()、rjust()左右对齐
>>>a.ljust(10,"*")
'SXT*******'
其他方法
方法 | 说明 |
---|---|
isalnum() | 是否为字母或数字 |
isalpha() | 检测字符串是否**只由字母(含汉字)**组成。 |
isdigit() | 检测字符串是否只由数字组成。 |
isspace() | 检测是否为空白符 |
isupper() | 是否为大写字母 |
islower() | 是否为小写字母 |
字符串格式化
format()
str.format()
>>> a = "{0}今年{1}岁,{0}的饭量很大" >>>a.format("Laiii",18)
'Laiii今年18岁,Laiii的饭量很大'
>>> b = "{name}今年{age}岁。"
>>>b.format(age=3,name="Laiii")
'Laiii今年3岁'
#通过{索引}或者{参数名}映射参数值实现对字符串的格式化
填充与对齐
^、<、>分别是居中、左对齐、右对齐,后面带宽度。
:号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充。
>>> "{0}正在{1:*^8}的海洋里溺水".format("Laiii","编程")
'Laiii正在***编程***的海洋里溺水'
数字 | 格式 | 输出 | 描述 |
---|---|---|---|
3.1415926 | {:.2f} | 3.14 | 保留小数点后两位 |
3.1415926 | {:+.2f} | 3.14 | 带符号保留小数点后两位 |
2.71828 | {:.0f} | 3 | 不带小数 |
5 | {:0>2d} | 05 | 数字补零 (填充左边, 宽度为 2) |
5 | {:x<4d} | 5xxx | 数字补 x (填充右边, 宽度为 4) |
10 | {:x<4d} | 10xx | 数字补 x (填充右边, 宽度为 4) |
1000000 | {:,} | 1,000,000 | 以逗号分隔的数字格式 |
0.25 | {:.2%} | 25.00% | 百分比格式 |
1000000000 | {:.2e} | 1.00E+09 | 指数记法 |
13 {:10d} | 13 | 右对齐 | (默认, 宽度为 10) |
13 {:<10d} | 13 | 左对齐 | (宽度为 10) |
13 {:^10d} | 13 | 中间对齐 | (宽度为 10) |
可变字符串
字符串修改频繁的时候可以使用 io.StringIO对象或 array 模块。
>>> s = "hello, sxt"
>>> sio = io.StringIO(s)
>>> sio
<_io.StringIO object at 0x02F462B0>
>>> sio.getvalue()
'hello, sxt' >>> sio.seek(7)
7
#指针移动到第七个个字符
>>> sio.write("g")
1
#修改第七个字符
>>> sio.getvalue()
'hello, gxt'