字符串是 Python 中最常用的数据类型。我们可以使用引号( ' 或 " )来创建字符串。
创建字符串很简单,只要为变量分配一个值即可。例如:
>>> var = 'hello world!'
>>> var
'hello world!'
>>> del var
>>> var
Traceback (most recent call last):
File "<pyshell#129>", line 1, in <module>
var
NameError: name 'var' is not defined
Python 不支持单字符类型,单字符在 Python 中也是作为一个字符串使用。
Python 访问子字符串,可以使用方括号来截取字符串,如下实例:
>>> var = 'hello world!'
>>> len(var)
12
>>> var[0]
'h'
>>> var[11]
'!'
>>> var[-1] #右边从-1开始索引
'!'
>>> var[0:2] #左闭右开
'he'
>>> var[-3:-1]
'ld'
可以截取字符串的一部分并与其他字段拼接,如下实例:
>>> var + 'python'
'hello world!python'
>>> var[:8] + 'java'
'hello wojava'
Python转义字符
在需要在字符中使用特殊字符时,python用反斜杠(\)转义字符。如下表:
转义字符 | 描述 |
---|---|
\(在行尾时) | 续行符 |
\\ | 反斜杠符号 |
\' | 单引号 |
\" | 双引号 |
\a | 响铃 |
\b | 退格(Backspace) |
\000 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
\oyy | 八进制数,yy 代表的字符,例如:\o12 代表换行,其中 o 是字母,不是数字 0。 |
\xyy | 十六进制数,yy代表的字符,例如:\x0a代表换行 |
\other | 其它的字符以普通格式输出 |
Python字符串运算符
下表实例变量a值为字符串 "Hello",b变量值为 "Python":
操作符 | 描述 | 实例 |
---|---|---|
+ | 字符串连接 | a + b 输出结果: HelloPython |
* | 重复输出字符串 | a*2 输出结果:HelloHello |
[] | 通过索引获取字符串中字符 | a[1] 输出结果 e |
[ : ] | 截取字符串中的一部分,遵循左闭右开原则,str[0:2] 是不包含第 3 个字符的。 | a[1:4] 输出结果 ell |
in | 成员运算符 - 如果字符串中包含给定的字符返回 True | 'H' in a 输出结果 True |
not in | 成员运算符 - 如果字符串中不包含给定的字符返回 True | 'M' not in a 输出结果 True |
r/R | 原始字符串 - 原始字符串:所有的字符串都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。 原始字符串除在字符串的第一个引号前加上字母 r(可以大小写)以外,与普通字符串有着几乎完全相同的语法。 | print( r'\n' ) print( R'\n' ) |
>>> var * 3
'hello world!hello world!hello world!'
>>> 'h' in var
True
>>> 'm' not in var
True
>>> print(r'\n')
\n
Python字符串格式化
Python 支持格式化字符串的输出 。尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中。在 Python 中,字符串格式化使用与 C 中 sprintf 函数一样的语法。
>>> print('我今年%d 岁,我叫%s' %(14, '肖明'))
我今年14 岁,我叫肖明
python字符串格式化符号:
符 号 | 描述 |
---|---|
%c | 格式化字符及其ASCII码 |
%s | 格式化字符串 |
%d | 格式化整数 |
%u | 格式化无符号整型 |
%o | 格式化无符号八进制数 |
%x | 格式化无符号十六进制数 |
%X | 格式化无符号十六进制数(大写) |
%f | 格式化浮点数字,可指定小数点后的精度 |
%e | 用科学计数法格式化浮点数 |
%E | 作用同%e,用科学计数法格式化浮点数 |
%g | %f和%e的简写 |
%G | %f 和 %E 的简写 |
%p | 用十六进制数格式化变量的地址 |
Python三引号
python三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。实例如下
>>> str1 = '''这是一个多行字符串的实例
多行字符串可以使用制表符
TAB ( \t )。
也可以使用换行符 [ \n ]。'''
>>> print(str1)
这是一个多行字符串的实例
多行字符串可以使用制表符
TAB ( )。
也可以使用换行符 [
]。
三引号也可以用来表示多行注释。
f-string
f-string,亦称为格式化字符串常量(formatted string literals),是Python3.6新引入的一种字符串格式化方法。之前我们习惯用百分号 (%):
>>> name = 'lebron'
>>> 'hello %s' %name
'hello lebron'
f-string在形式上是以 f 或 F 修饰符引领的字符串(f'xxx' 或 F'xxx'),以大括号 {} 标明被替换的字段;
f-string在本质上并不是字符串常量,而是一个在运行时运算求值的表达式。
>>> name = 'lebron'
>>> age = 16
>>> print(f'姓名:{name}, 年龄:{age}')
姓名:lebron, 年龄:16
>>> one_dict = {'name': 'kobe', 'age': 18, 'hobby': 'singing and rap'}
>>> print(f"姓名:{one_dict['name']}, 爱好:{one_dict['hobby']}")
姓名:kobe, 爱好:singing and rap
f-string是在运行时进行渲染的,因此可以将任何有效的Python表达式放入其中
>>> a = 'f-'
>>> b = 'string'
>>> print(f'{8*10}, {{8*10}}, {a + b}')
80, {8*10}, f-string
常用的几种字符串操作方法
截取字符串
语法格式: string[start : end : step]
参数说明
- string:表示要截取的字符串
- start:表示要截取的第一个字符的索引(包括该字符),如果不指定,则默认为0
- end:表示要截取的最后一个字符的索引(不包括该字符),如果不指定则默认为字符串的长度。
- step:表示切片的步长,如果省略,则默认为1,当省略该步长时,最后一个冒号也可以省略。
>>> str1 = 'hello python!'
>>> str1[0] #顺序时,索引从0开始
'h'
>>> str1[-1]#倒序时,索引从-1开始
'!'
>>> str1[0::2] #切割步长为2
'hlopto!'
>>> str1[2:-2] #从第3个字符开始截断,直至倒数第2个字符,不包括倒数第2个字符
'llo pytho'
>>> str1[3:2] #如果第一个参数大于等于第2个参数,则输出空
''
>>> str1[-1:1]
''
>>> str1[: 3] #索引到第4个字符
'hel'
>>> str1[:]
'hello python!'
>>> str1[2: ]
'llo python!'
分割字符串
python中分割字符串是使用split()方法把字符串分割成列表
语法格式 : str.split(sep, maxsplit)
参数说明:
- str:表示要进行分割的字符串
- sep:用于指定分隔符,可以包含多个字符,默认为None,即所有空字符(包括空格、换行"n”、制表符“t”等)。
- maxsplit:可选参数,用于指定分割的次数,如果不指定或者为-1,则分割次数没有限制,否则返回结果列表的元素个数最多为 maxsplit+1
- 返回值:分隔后的字符串列表。
>>> str1 = 'i am a good boy!'
>>> str1.split() #采用默认分隔符进行分割
['i', 'am', 'a', 'good', 'boy!']
>>> str1.split(' ') #采用空格进行分割
['i', 'am', 'a', 'good', 'boy!']
>>> str1.split(' ', 3) #采用空格进行分割,且最多分割为4个元素
['i', 'am', 'a', 'good boy!']
>>> str1.split('m', 3) #采用m进行分割,且最多分割为4个元素
['i a', ' a good boy!']
2、rsplit()和splitlines()方法
语法格式:str.rsplit(sep=None, maxsplit=-1)
str.splitlines([keepends=True])
作用:rsplit()和split()是一样的,只不过是从右边向左边搜索。
splitlines()用来专门用来分割换行符。虽然它有点像split('\n')或split('\r\n'),但它们有些区别,见下文解释。
>>> str1 = 'i am a good boy!'
>>> str1.rsplit()
['i', 'am', 'a', 'good', 'boy!']
>>> str1.rsplit(' ')
['i', 'am', 'a', 'good', 'boy!']
>>> str1.rsplit(' ', 3)
['i am', 'a', 'good', 'boy!']
>>> str1.rsplit('m', 3)
['i a', ' a good boy!']
splitlines()中可以指定各种换行符,常见的是\n、\r、\r\n。如果指定keepends为True,则保留所有的换行符。
>>> str1 = 'a bc\n \n adc\r '
>>> str1.splitlines()
['a bc', ' ', ' adc', ' ']
>>> str1 = 'a bc\n\n adc\r '
>>> str1.splitlines()
['a bc', '', ' adc', ' ']
>>> str1.splitlines(keepends = True)
['a bc\n', '\n', ' adc\r', ' ']
将split()和splitlines()相比较一下:
>>> ''.split('\n') #无换行符可分割
['']
>>> 'One line\n'.split('\n')
['One line', '']
>>> ''.splitlines()#无换行符可分割
[]
>>> 'One line\n'.splitlines()
['One line']
3、partition()和rpartition()方法
语法格式:str.partition(sep)
str.rpartition(sep)
作用:搜索字符串中的子串sep,并从sep处对字符串进行分割,最后返回一个包含3元素的元组:sep左边的部分是元组的第一个元素,sep自身是元组的二个元素,sep右边是元组的第三个元素。
partition(sep)从左边第一个sep进行分割,rpartition(sep)从右边第一个sep进行分割。
如果搜索不到sep,则返回的3元素元组中,有两个元素为空。partition()是后两个元素为空,rpartition()是前两个元素为空。
>>> str1 = 'abcxyzopq' #只检测到一个sep
>>> str1.partition('xy')
('abc', 'xy', 'zopq')
>>> str1.rpartition('xy')
('abc', 'xy', 'zopq')
>>> str1 = 'abcxyopqerxyasdfc' #检测到多个sep
>>> str1.partition('xy')
('abc', 'xy', 'opqerxyasdfc')
>>> str1.rpartition('xy')
('abcxyopqer', 'xy', 'asdfc')
>>> str1 = 'abcxyzopq' #检测不到sep
>>> str1.partition('zx')
('abcxyzopq', '', '')
>>> str1.rpartition('zx')
('', '', 'abcxyzopq')
检索字符串
python中字符串的查找方法
1、count()方法
语法格式 : str.count(sub[, start[, end]])
作用:用于检索指定字符串在另一个字符串中出现的次数,如果检索的字符串不存在则返回0,否则返回出现的次数。
参数说明
- str:表示原字符串
- sub:表示要检索的子字符串
- start:可选参数,表示检索范围的起始位置的索引,如果不指定,则从头开始检索
- end:可选参数,表示检索范围的结束位置的索引,如果不指定,则一直检索到结尾
>>> str1 = 'i am a good boy!'
>>> str1.count('o')
3
>>> str1.count('o',0, 10)
2
2、find()方法
语法格式 : str.find(sub[, start[, end]])
作用:检索是否包含指定的字符串,如果检索的字符串不存在则返回-1,否则返回首次出现该字符串时的索引。后面两参数用于指定检索范围,参数可选。
>>> str1 = 'i am a good boy!'
>>> str1.find('am')
2
>>> str1.find('am', 5, 10)
-1
3、index()方法
语法格式 : str.index(sub[, start[, end]])
作用:和find方法类似,也用于检索是否包含指定的字符串,使用index方法,当指定的字符串不存在时会抛异常。
>>> str1 = 'i am a good boy!'
>>> str1.index('am')
2
>>> str1.index('am', 5, 10)
Traceback (most recent call last):
File "<pyshell#181>", line 1, in <module>
str1.index('am', 5, 10)
ValueError: substring not found
4、startswith()方法
语法格式 : str.startswith(prefix[, start[, end]])
作用:检索字符串是否以指定的字符串开头,如果是则返回true,否则返回false。
>>> str1 = 'i am a good boy!'
>>> str1.startswith('i')
True
>>> str1.startswith('i', 5, 8)
False
5、endswith()方法
语法格式 : str.endswith(prefix[, start[, end]])
作用:检索字符串是否以指定的字符串结尾,如果是则返回true,否则返回false。
>>> str1 = 'i am a good boy!'
>>> str1.endswith('!')
True
>>> str1.endswith('a', 0, 3) #不包括第4个字符
True
>>> str1.endswith('a', 0, 2)
False
字符串的大小写转换
1、lower()方法
语法格式 : str.lower()
作用:将字符串中的大写字母转换为小写字母
>>> str1 = 'I LoVe You!'
>>> str1.lower()
'i love you!'
2、upper()方法
语法格式 : str.upper()
作用:将字符串中的小写字母转换为大写字母
>>> str1 = 'i love you baby!'
>>> str1.upper()
'I LOVE YOU BABY!'
3、capitalize()方法
语法格式:str.capitalize()
作用:将字符串的首字母转换为大写
需要注意的是:
1、首字符会转换成大写,其余字符会转换成小写。
2、首字符如果是非字母,首字母不会转换成大写,其余会转换成小写。
>>> str1 = 'i love you baby!'
>>> str1.capitalize()
'I love you baby!'
>>> str1 = 'i LoVe You!'
>>> str1.capitalize()
'I love you!'
>>> str1 = '2i liVe'
>>> str1.capitalize()
'2i live'
4、title()方法
语法格式:str.title()
作用:返回"标题化"的字符串,就是说所有单词的首个字母转化为大写,其余字母均为小写
>>> str1 = ' hello world1 '
>>> str1.title()
' Hello World1 '
与之对应的为istitle()方法,用来检测字符串中所有的单词拼写首字母是否为大写,且其他字母为小写。如果是,则返回True,否则返回False。
>>> str1 = ' hello world1 '
>>> str1.title()
' Hello World1 '
>>> str2 = str1.title()
>>> str2.istitle()
True
5、swapcase()方法
语法格式:str.swapcase()
作用:对字符串的大小写字母进行转换,也就是将大写转换为小写,将小写转换为大写
>>> str1 = 'i LoVe You!'
>>> str1.swapcase()
'I lOvE yOU!'
去除字符串中的空格和特殊字符
开发中,我们会遇到这样的需求,字符串前后(左右侧)不允许出现空格和特殊字符或者将用户输入的字符串中误输入的空格去除掉。
1、strip()方法
语法格式 : str.strip([chars])
作用:去除字符串前后(左右侧)的空格或特殊字符
>>> str1 = ' hello world1 '
>>> str1.strip() #默认去除字符串左右的空格
'hello world1'
>>> str1 = ' #hello world1 @'
>>> str1.strip() #在参数空缺时,只去除空格
'#hello world1 @'
>>> str1.strip('#') #加入参数后去除参数字符,此时不再去除空格
' #hello world1 @'
>>> str1.strip('@')
' #hello world1 '
2、lstrip()方法
语法格式 : str.lstrip([chars])
作用:去除字符串前面(左侧)的空格或特殊字符
>>> str1 = ' hello world1 '
>>> str1.lstrip()
'hello world1 '
>>> str1 = '#hello world1 #'
>>> str1.lstrip()
'#hello world1 #'
>>> str1.lstrip('#')
'hello world1 #'
3、rstrip()方法
语法格式 : str.rstrip([chars])
作用:去除字符串后面(右侧)的空格或特殊字符(换行符、制表符等)
>>> str1 = ' hello world1 '
>>> str1.rstrip()
' hello world1'
>>> str1 = '#hello world1 #'
>>> str1.rstrip('#')
'#hello world1 '
判断字符串类型
1、isalnum()方法
语法格式:str.isalnum()
作用:如果字符串至少有一个字符并且所有字符都是字母或数字、文字则返回 True,否则返回 False
>>> str1 = '123abc'
>>> str1.isalnum()
True
>>> str1 = '123abc '#加空格
>>> str1.isalnum()
False
>>> str1 = '123abc肖明' #加入汉字也返回True
>>> str1.isalnum()
True
2、isalpha()方法
语法格式:str.isalpha()
作用:如果字符串至少有一个字符并且所有字符都是字母或文字则返回 True,否则返回 False。
>>> str1 = '123abc肖明'
>>> str1.isalpha()
False
>>> str1 = 'abc肖明'
>>> str1.isalpha()
True
>>> str1 = 'abcxyz'
>>> str1.isalpha()
True
3、isnumeric()方法
语法格式:str.isnumeric()
作用:检测字符串是否只由数字组成,数字可以是: Unicode 数字,全角数字(双字节),罗马数字,汉字数字。如果字符串中只包含数字字符,则返回 True,否则返回 False。
>>> str1 = '123789'
>>> str1.isnumeric()
True
>>> str1 = 'xyz123abc'
>>> str1.isnumeric()
False
4、isdecimal()方法
语法格式:str.isdecimal()
作用:检查字符串是否只包含十进制字符。这种方法只存在于unicode对象。注意:定义一个十进制字符串,只需要在字符串前添加 'u' 前缀即可。
>>> str1 = '123abc'
>>> str1.isdecimal()
False
>>> str1 = '567'
>>> str1.isdecimal()
True
>>> str1 = b'010111'
>>> str1.isdecimal()
Traceback (most recent call last):
File "<pyshell#241>", line 1, in <module>
str1.isdecimal()
AttributeError: 'bytes' object has no attribute 'isdecimal'
5、isdigit()方法
语法格式:str.isdigital()
作用:检测字符串是否只由数字组成。如果字符串只包含数字则返回 True 否则返回 False。
>>> str1 = '123456'
>>> str1.isdigit()
True
>>> str1 = '123四'
>>> str1.isdigit()
False
6、isspace()方法
语法格式:str.isspace()
作用:检测字符串是否只由空白字符组成。如果字符串中只包含空格,则返回 True,否则返回 False。空白符包含:空格、制表符(\t)、换行(\n)、回车(\r)等。
>>> str1 = ''
>>> str1.isspace()
False
>>> str1 = ' '
>>> str1.isspace()
True
>>> str1 = ' \n'
>>> str1.isspace()
True
字符串填充
1、center()方法
语法格式:str.center(width[, fillchar])
作用:将字符串居中,左右两边使用fillchar进行填充,使得整个字符串的长度为width。fillchar默认为空格。如果width小于字符串的长度,则无法填充直接返回字符串本身(不会创建新字符串对象)。
>>> str1 = 'ab'
>>> len(str1)
2
>>> str1.center(6)
' ab '
>>> str1.center(4, '*')
'*ab*'
>>> str1.center(1)
'ab'
>>> str1.center(8, '*&') #填充的字符串长度只能为1
Traceback (most recent call last):
File "<pyshell#259>", line 1, in <module>
str1.center(8, '*&')
TypeError: The fill character must be exactly one character long
2、ljust()和rjust()方法
语法格式:str1.ljust(width[, fillchar])
str1.rjust(width[, fillchar])
作用:ljust()使用fillchar填充在字符串的右边,使得整体长度为width,左对齐。rjust()则是填充在左边,右对齐。如果不指定fillchar,则默认使用空格填充。如果width小于或等于字符串的长度,则无法填充,直接返回字符串(不会创建新字符串对象)。
>>> str1 = 'ab'
>>> str1.ljust(4)
'ab '
>>> str1.ljust(4, '*')
'ab**'
>>> str1.ljust(1)
'ab'
>>> str1.rjust(4)
' ab'
>>> str1.rjust(4, '*')
'**ab'
>>> str1.rjust(1)
'ab'
3、zfill()方法
语法格式:str.zfill(width)
作用:用0填充在字符串的左边使其长度为width,右对齐。如果字符串前有正负号+/-,则0填充在这两个符号的后面,且符号也算入长度。如果width小于或等于字符串的长度,则无法填充,直接返回字符串本身(不会创建新字符串对象)。
>>> str1 = 'ab'
>>> str1.zfill(4)
'00ab'
>>> str1.zfill(1)
'ab'
>>> str1 = '-ab12'
>>> str1.zfill(8)
'-000ab12'
字符串替换
1、replace()方法
语法格式:str.replace(old, new[, count])
作用:将字符串中的子串old替换为new字符串,如果给定count,则表示只替换前count个old子串。如果字符串中搜索不到子串old,则无法替换,直接返回字符串(不创建新字符串对象)。
>>> str1 = 'abcxyopqerxyasdfc'
>>> str1.replace('xy', 'XY')
'abcXYopqerXYasdfc'
>>> str1.replace('xy', 'XY', 1)
'abcXYopqerxyasdfc'
>>> str1.replace('zf', 'XY')
'abcxyopqerxyasdfc'
2、expandtabs() 方法
语法格式:str.expandtabs(N)
作用:把字符串中的 tab 符号('\t')转为空格,tab 符号('\t')默认的空格数是 8。
注意,expandtabs(8)不是将\t直接替换为8个空格。例如'xyz\tab'.expandtabs()会将\t替换为5个空格,因为"xyz"占用了3个字符位。\t 是补全当前字符串长度到4的整数倍,最少 1 个最多 8 个空格。另外,它不会替换换行符(\n或\r)。
>>> str1 = "this is\t string example....wow!!!"
>>> str1.expandtabs()
'this is string example....wow!!!'
>>> str1.expandtabs(16)
'this is string example....wow!!!'
>>> str1.expandtabs(12)
'this is string example....wow!!!'
3、join() 方法
语法格式:str.join(iterable)
作用:将可迭代对象(iterable)中的字符串使用str连接起来。注意,iterable中必须全部是字符串类型,否则报错。
>>> str1 = 'love'
>>> str1.join(' ')
' '
>>> ' '.join(str1)
'l o v e'
>>> ' '.join(123)
Traceback (most recent call last):
File "<pyshell#312>", line 1, in <module>
' '.join(123)
TypeError: can only join an iterable