Python学习笔记 -- 序列(二)字符串

时间:2023-01-04 10:08:00

Python学习笔记 – 序列(二)字符串

标签(空格分隔): python 字符串 序列


字符串

是Python中的数据集类型(数据集类型:是由一组Python对象构成的单个对象)之一。
字符串类型是一类特殊的数据集对象,称为序列。序列类型中的对象按一定的顺序排列,即对象序列。
python字符串是对象,它的属性就是字符序列。其是单个字符的序列。
注:字符串是不可变的

>>> str1 = "Hello World"
>>> print str1
Hello World
>>> id(str1)
41184832
>>> str1 = "Hello Python"
>>> print str1
Hello Python
>>> id(str1)
41188152

对字符串修改时,字符串会创建新的对象。即此处虽然是同名变量,但是关联(引用)的对象已经不同了(通过其id返回的值可以看出)。

>>> str1[0] = 'h'
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
str1[0] = 'h'
TypeError: 'str' object does not support item assignment

对之前的str1做修改,会提示错误。这种限制在一定程度下来说是基于效率原因而设定的。字符串不可改变,python解释器运行起来更快。

>>> print str1[1]
e
>>> for i in str1:
print i,

H e l l o P y t h o n
>>>

由于字符串也是序列,所以也可以通过下标来访问其中的值。当然,其也有切片操作。

>>> print str1[:]
Hello Python
>>> print str1[1:7]
ello P

字符串的创建

Python中的字符串通过两种方式创建:

1. 通过字符串的构造函数str来创建

>>> str("String")
'String'

2. 通过单引号(’)或双引号(”)创建 - - 字面量创建

>>> 'String'
'String'
>>> "String"
'String'

注意: 在使用引号创建字符串时,要注意单双引号的混用,不要交叉使用。

#单双引号的混用
>>> "It's a String"
"It's a String"
#引号匹配问题 -> Error
>>> 'It's a String'
SyntaxError: invalid syntax
>>>

更多单双引号及三引号的使用问题,参看Python中单、双引号及多引号区别

3. 原始字符串操作符

原始字符串,是指所有的字符串都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。
原始字符串这个特性让很多字符串操作变得简单方便,比如正则表达式的创建。
‘r’符号就是原始字符串操作符,可以是大写,也可以是小写,但是在使用时必须要紧靠在字符串的第一个引号前。

>>> '\n'
'\n'
>>> print '\n'


>>> r'\n'
'\\n'
>>> print r'\n'
\n

在涉及到路径和正则表达式中,使用的较多,这个后续整理。


字符串运算符操作

1. +和*运算符(重载运算符)

运算符 作用
+运算符 用于连接字符串
*运算符 用于字符串的重复
>>> str1 = "Hello "
>>> str2 = "World!"
>>> str3 = str1 + str2 # +运算符,连接str1和str2字符串
>>> print str3
Hello World!
>>> str4 = str3 * 3 # *运算符,重复str3字符串3次
>>> print str4
Hello World!Hello World!Hello World!

2. in和not in运算符

运算符 作用
in运算符 用于检查集合的成员,测试字符串序列是否在字符串中
not in运算符 用于检查某对象是不在字符串中
#in操作符
>>> str1 = "Hello World"
>>> 'o' in str1
True
>>> 'b' in str1
False
>>> 'rl' in str1
True
>>> 'Hl' in str1
False
#not in 操作符
>>> str1 = "Hello World"
>>> a not in str1 #注意a和'a'的区别
Traceback (most recent call last):
File "<pyshell#58>", line 1, in <module>
a not in str1
NameError: name 'a' is not defined
>>> 'a' not in str1
True

单个字符时,会检查字符是否在字符串中,是的话返回True,否则为False;多个字符时,会检查是否按照此字符顺序显示在字符串中,是则为True,否则为False。


字符串比较

1. 单个字符比较

>>> 'a' > 'B'
True
>>> 'a' == 'A'
False
>>> 'a' < ' '
False

单个字符比较时,比较的是字符的ASCII码,可以通过ord()(将字符转为ASCII值的函数,chr()与之相反)来测试。

函数 作用
ord() 将字符转为ASCII值
chr() 将ASCII值转为字符
>>> ord('a'),ord('B')
(97, 66)
>>> ord('a'),ord('A')
(97, 65)
>>> ord('a'),ord(' ')
(97, 32)

2. 多个字符比较

>>> 'abc' > 'abd'
False
>>> 'abc' < 'abcd'
True

多个字符串比较也是基于字符的ASCII的比较,基本思路是并行的检查两个字符串中位于同一位置的两个字符的ASCII码大小,直到找到两个不同的字符为止。

  • 从两个字符串中索引为0的位置开始比较
  • 比较位于当前位置的两个单字符
    如果两个字符相等,则两个字符串的索引加1,并继续下一个比较
    如果两个字符串不相等,返回这两个字符的比较结果,作为字符串的比较结果
  • 如果两个字符串比较到一个字符串结束时都相等,则较长的字符串更大

3. 内建函数比较

cmp()函数,同操作符一样,根据字符串的ACSII码值来比较。
cmp(x,y),当x

>>> str1 = 'abc';
>>> str2 = 'bcd';
>>> str3 = '123';
>>> cmp(str1,str2)
-1
>>> cmp(str2,str3)
1
>>> cmp(str3,str1)
-1

字符串变换

1. 字符串中字符大小写变换

1.1 Python内置函数**

函数名称 函数作用
lower() 字符串转为小写
upper() 字符串转为大写
swapcase() 大小写互换
capitalize() 首字母大写
>>> str1 = 'hello Python!'
>>> print str1
hello Python!
>>> str1.lower()
'hello python!'
>>> str1.upper()
'HELLO PYTHON!'
>>> str1.swapcase()
'HELLO pYTHON!'
>>> str1.capitalize()
'Hello python!'

1.2 string模块函数:

            string.capwords(s)   #首字母转为大写
#它是先把s用split()函数分开,再用capitalize()把首字母变成大写,最后用join()合并到一起
>>> import string
>>> str1 = 'hello Python!'
>>> print(string.capwords(str1))
Hello Python!
>>> str1 = 'hello-Python!'
>>> print(string.capwords(str1))
Hello-python!
>>> str1 = 'hEllO Python'
>>> print(string.capwords(str1))
Hello Python
>>> str1 = 'hEllO-Python'
>>> print(string.capwords(str1))
Hello-python

由上面程序,可以看出,capwords(str1),是通过split()以空格把字符串分割成多个,然后对每个字符串的首字母进行转换,其余字母变成小写字母,然后再通过join()来链接字符串。


字符串转换

1. 字符串转换为其他函数

下面的几个函数存在于string模块中。

函数 含义
S.atoi(s[,base]) base默认为10,如果为0,那么s就可以是012或0x23这种形式的字符串,如果是16那么s就只能是0x23或0X12这种形式的字符串
S.atol(s[,base]) 转成long
S.atof(s[,base]) 转成float

2. 字符串的编码和解码

字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码

函数 含义
S.encode([encoding,[errors]]) 将unicode编码转换成其他编码的字符串
S.decode([encoding,[errors]]) 将其他编码的字符串转换成unicode编码

这一部分后面再详细整理…


字符串格式化

>>> str1 = 'Hello Python'
>>> print "format String : %s" %(str1)
format String : Hello Python
>>> '{0} {1}'.format('Hello','Python')
'Hello Python'
>>> str1 = '{0},{1}'
>>> str1.format('Hello','Python')
'Hello,Python'

1. 常用格式描述符

格式描述符 含义
%s 字符串
%d 十进制数
%f 浮点小数
%e 浮点指数

格式描述符的格式:
%[name][flags][width][.precision]code

2. 字符串格式转换类型

格式描述符 含义
%c 字符及其ASCII码
%s 字符串(使用str转换任意Python对象)
%r 字符串(使用repr转换任意Python对象)
%d(%i) 有符号整数(十进制)
%u 无符号整数(十进制)
%o 无符号整数(八进制)
%x 无符号整数(十六进制)
%X 无符号整数(十六进制大写字符)
%e 浮点数字(科学计数法)
%E 浮点数字(科学计数法,用E代替e)
%f(%F) 浮点数字(用小数点符号)
%g 浮点数字(根据值的大小采用%e或%f)
%G 浮点数字(类似于%g)
%p 指针(用十六进制打印值的内存地址)
%n 存储输出字符的数量放进参数列表的下一个变量中

字符串的其他操作

1. 字符串连接:

 - 字面量的自动级连字符串
- +运算符
- s.__add__(s1)
- s.join(iterable)
>>> 'Hello ''Python'
'Hello Python' #自动级连
>>> str1 = 'Hello'
>>> str1 = str1.__add__('Python')
>>> print str1
HelloPython
>>> list = ['Hello','Python']
>>> str1 = ' '.join(list) # 将列表转为字符串
>>> print str1
Hello Python

通过上面代码,延伸一下,我们即可以通过切片操作来实现字符串的修改。

>>> str1 = "HeLlo"
>>> print str1
HeLlo
>>> str1 = str1[:2] + "l" + str1[3:]
>>> print str1
Hello

2. 字符串的分割

函数 含义
S.split([sep, [maxsplit]]) 以sep是分隔符,把s分割成一个list。sep默认为空格。maxsplit是分割的次数,不填写这个参数时,默认是对整个s进行分割
S.rsplit([sep, [maxsplit]]) 和split()的区别是它是从s的串尾往前进行分割
S.splitlines([keepends]) 把S按照行分割符分为一个list,keepends是一个bool值,如果为真每行后而会保留行分割符,否则不保留分隔符
>>> str1 = "Hello World, Hello Python!"
>>> str1.split ()
['Hello', 'World,', 'Hello', 'Python!']
>>> str1.split ("o")
['Hell', ' W', 'rld, Hell', ' Pyth', 'n!']
>>> str1.split ("o",3)
['Hell', ' W', 'rld, Hell', ' Python!']
>>> str1.rsplit ("o",3)
['Hello W', 'rld, Hell', ' Pyth', 'n!']
>>> str2 = "Hello\n World,\n Hello\n Python!"
>>> str2.splitlines(True)
['Hello\n', ' World,\n', ' Hello\n', ' Python!']
>>> str2.splitlines(False)
['Hello', ' World,', ' Hello', ' Python!']

3. 字符串的查找(搜索):

查找字符串中是否含有某个字符串,并给出相应的操作。

函数 含义
S.find(substr, [start, [end]]) 返回S中出现substr的第一个字母的标号,如果S中没有substr则返回-1。
S.index(substr, [start, [end]]) 与find()相同,只是在S中没有substr时,会返回一个运行时错误
S.rfind(substr, [start, [end]]) 返回S中最后出现的substr的第一个字母的标号,如果S中没有substr则返回-1
S.rindex(substr, [start, [end]]) 返回S中最后出现的substr的第一个字母的标号,如果S中没有substr则返回一个运行时错误
S.count(substr, [start, [end]]) 计算substr在S中出现的次数
S.replace(oldstr, newstr, [count]) 把S中的oldstar替换为newstr,count为替换次数,不给替换次数时,默认全部替换。这是替换的通用形式,还有一些函数进行特殊字符的替换
S.strip([chars]) 把S中前后chars中有的字符全部去掉,可以理解为把S前后chars替换为None
S.lstrip([chars]) 把S前,chars中有的字符全部去掉,可以理解为把S前的chars替换为None
S.rstrip([chars]) 把S后,chars中有的字符全部去掉,可以理解为把S后的chars替换为None
>>> str1 = "Hello Python"
>>> print str1.find("P")
6
>>> print str1.find("Py") #返回要查找的字符串的第一个字符在str1中第一次出现的索引
6
>>> print str1.find("a") #要查找的字符串不存在时返回-1
-1
>>> print str1.index
<built-in method index of str object at 0x02743C78>
>>> print str1.index("P")
6
>>> print str1.index("Py") #返回要查找的字符串的第一个字符在str1中第一次出现的索引
6
>>> print str1.index("a") #要查找的字符串不存在时报错

Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
print str1.index("a")
ValueError: substring not found
>>>
>>> str2 = "Hello world"
>>> print str2.count("l") #返回查找的字符串在str2中出现的次数
3
>>> print str2.count("a") #str2中没有该字符串时,返回0
0
>>>
>>> print str2.replace ("l","a",1) #替换str2中的"l"为"a"一次
Healo world
>>> print str2.replace("l","a") #不给替换次数时,默认为全部替换
Heaao worad
>>>
>>> str3 = " Hello World "
>>> print str3
Hello World
>>> print str3.lstrip() #去除str3中"Hello World"前的空格
Hello World
>>> print str3.rstrip()
Hello World
>>> print str3.strip()
Hello World
>>>
>>> str3 = '''
Hello World
'''

>>> print str3

Hello World

>>> print str3.strip() #去除str3中前后的换行
Hello World
>>> str4 = "---Hello World---"
>>> print str4
---Hello World---
>>> print str4.strip("-") #去除str4中前后的'-'
Hello World
>>>

4. 字符串的检测方法

下面函数用于检测字符串,但是都不在string模块中,且返回的都是bool类型值。

函数 含义
S.startwith(prefix[,start[,end]]) 是否以prefix开头
S.endwith(suffix[,start[,end]]) 是否以suffix结尾
S.isalnum() 是否全是字母和数字,并至少有一个字符
S.isalpha() 是否全是字母,并至少有一个字符
S.isdigit() 是否全是数字,并至少有一个字符
S.isspace() 是否全是空白字符,并至少有一个字符
S.islower() S中的字母是否全是小写
S.isupper() S中的字母是否便是大写
S.istitle() S是否是首字母大写的
>>> str1 = "-Hello world-"
>>> str1.startswith("-")
True
>>> str1.endswith("-")
True
>>> str1.startswith(" ")
False
>>>
>>> str1.startswith() #必须给一个值,不然会报错
Traceback (most recent call last):
File "<pyshell#77>", line 1, in <module>
str1.startswith()
TypeError: startswith() takes at least 1 argument (0 given)
>>>
>>> str1.isalnum () #是否全是数字或字母
False
>>> str2 = "Hello World"
>>> str2.isalnum ()
False
>>> str3 = "HelloWorld"
>>> str3.isalnum ()
True
>>> str3 = "HelloWorld123"
>>> str3.isalnum ()
True
>>>