Python 文本/字符串类型 str 使用说明
本节的“字符₁”一词是指 Unicode 中 Lu,Ll,Lt 分类的字符,“字母字符₁”一词是指 Unicode 中 Lu,Ll,Lt,Lm,Lo 分类的字符。
Python 文本/字符串类型
Python 中的文本/字符串类型str
继承自序列类型Sequence
,用于表示文字信息,其字面量的书写需要使用成对的引号,这包括单引号('
),双引号("
),三重单引号('''
),三重双引号("""
),其中三重引号可接受多行的文字信息。
将 Python 字符串的字面量分为多个部分
多个紧密相邻或使用空白(包括空格,换行等)分隔的字符串字面量,将等同于一个字符串字面量,这种效果可以让你为字符串的不同部分分别注释,从而使各部分的作用更容易被理解。
需要指出,当被分隔的字符串字面量可能位于多个表达式中时,应使用()
将他们括住。
在下面的代码中,我们将用于生成邮箱正则表达式的字符串分成了三行,并使用()
括住,否则每一行均会被认定为新的表达式。需要检测的邮箱地址被书写为"xiao_xiao" '@' '''live.com'''
,他等同于'xiao_xiao@live.com'
。
# 一个用于生成邮箱正则表达式的字符串
pattern = (
'\\b[\\w.%-]+' # 邮箱中 @ 前面的部分
'@' # 邮箱中的 @
'[a-zA-Z0-9.\\-]+\\.[a-zA-Z]{2,4}' # 邮箱中 @ 后面的部分
)
import re
print(re.search(pattern, "xiao_xiao" '@' '''live.com'''))
<re.Match object; span=(0, 18), match='xiao_xiao@live.com'>
如何获取 Python 字符串的长度?
Python 的len
函数可用于获取字符串长度,这将调用字符串对象的__len__
方法。比如,len('Hello\tWorld\r\n')
的结果为13
。
如何反转 Python 字符串?
使用 Python 的切片表达式::-1
可以反转字符串,比如,'Hello'[::-1]
的结果为'olleH'
。或者,先使用reversed
函数将字符串转换为一个顺序反转的迭代器对象,然后使用str
类型的join
方法将迭代器对象联接为字符串,比如,''.join(reversed('Hello'))
的结果为'olleH'
。
序列类型
str
类型拥有 Python 序列类型的通用功能,你可以查看Python 序列类型 list,tuple,range 使用说明一节了解相关信息。
使用 str 构造器创建 Python 字符串
除了使用字面量,你还可以通过str
类型的构造器来创建 Python 字符串,他的形式如下。
str(object='')
str(object=b'', encoding=sys.getdefaultencoding(), errors='strict')
- object 参数
object
参数表示用于生成字符串的对象,如果未指定则得到空字符串。- encoding 参数
encoding
参数表示在解码类字节序列(bytes-like
)对象时,所采用的编码格式,默认为sys.getdefaultencoding()
的返回值('utf-8'
)。- errors 参数
errors
参数表示对解码异常的处理方式,默认为'strict'
,将抛出UnicodeError
。其他的取值包括'ignore'
,'replace'
等。
对于第一种形式,str
构造器将返回object
对象的__str__
方法的返回值,当__str__
方法不存在时,将返回__repr__
方法的返回值。
对于第二种形式,object
一般是一个类字节序列对象,参数encoding
和errors
被用于类字节序列对象的解码操作,str
构造器将返回解码产生的字符串。具体的解码任务由类字节序列对象的decode
方法完成。
str(b'\x61\x62\x63')
"b'abc'"
str(b'\x61\x62\x63', 'utf-8')
'abc'
Python 对象的 __str__ 和 __repr__ 方法
Python 对象的__str__
方法,返回对象非正式的字符串表达形式,这意味着__str__
返回的内容更有利于非开发人员的阅读。
Python 对象的__repr__
方法,返回对象正式的字符串表达形式,这种形式通常包含了对象中的数据,可用于辅助开发人员的调试工作。
在 Python 字符串中转义字符
与大部分编程语言一样,Python 字符串同样将字符\
作为转义字符,比如'\tHello'
中的\
。以下是 Python 中常见的转义序列。
转义序列 表示内容 \\ 反斜杠 \' 单引号 \" 双引号 \n 换行符 \r 回车符 \b 退格符 \t 水平制表符 \v 垂直制表符 \f 换页符 \ooo 八进制数字 ooo 表示的字符 \xhh 十六进制数字 hh 表示的字符 \uxxxx 十六进制数字 xxxx 表示的字符 \Uxxxxxxxx 十六进制数字 xxxxxxxx 表示的字符 \N{name} Unicode 中名称为 name 的字符
print('\'你好\'')
'你好'
print("\101\x42\u0043\U00000044")
ABCD
print('\N{TAB}Hello')
Hello
如何禁止 Python 字符串中的 \ 成为转义字符?
使用 Python 原始字符串,即以r
或R
为前缀的字符串,可以禁止\
成为转义字符。在一些特殊情况下这非常有效,比如包含文件路径的字符串,因为你不必再将路径中的每个\
转义为\\
。
需要指出的是,虽然 Python 原始字符串不会将\
视为转义字符,但单个\
不能出现在字符串的结尾,这意味着如果字符串以单个\
结束,那么使用 Python 原始字符串将导致错误,比如r'C:\python\'
。
R'C:\python\3.14'
'C:\\python\\3.14'
Python 字符串中无法识别的转义序列将导致异常或警告
在 Python 3.6 或更高的版本中,Python 字符串中无法被识别的转义序列将导致异常或警告,而在之前的版本中,转义字符\
将被保留。
转义
关于转义,转义字符,转义序列等基本概念,你可以查看编程教程的转义,转义字符,转义序列介绍一节了解更多。
格式化 Python 字符串
Python 的str
类型提供了format
和format_map
方法,用于对字符串进行格式化。
format
方法使用可变参数kwargs
替换字符串中的可替换项,可替换项使用{}
或{n}
表示,其中n
为可变参数kwargs
的索引。
format_map
方法使用字典参数mapping
替换字符串中的可替换项,可替换项使用{n}
表示,其中n
为字典的键。
查找和替换 Python 字符串中的内容
对于字符串的查找和替换,Python 的str
类型提供了众多的方法,这些方法一般包含start
和end
参数,他们被用于切片操作,以针对字符串中的某一部分进行运算,如果未指定start
和end
参数,则运算会针对整个字符串。
Pythonstr
类型的count
方法用于获取指定字符串在目标字符串中出现的次数。
count(sub[, start[, end]], /)
- sub 参数
sub
参数表示需要查找的字符串,如果传递空字符串,则返回的次数为字符串长度加1
。
Pythonstr
类型的startswith
方法用于判断字符串是否以指定的字符串开始,如果是则返回True
,否则返回False
。str
类型的endswith
方法用于判断字符串是否以指定的字符串结束,如果是则返回True
,否则返回False
。
startswith(prefix[, start[, end]], /)
endswith(suffix[, start[, end]], /)
- prefix 参数
prefix
参数表示目标字符串开头部分需要匹配的字符串,如果该参数是包含多个字符串的元组,那么目标字符串的开头只需要与其中之一匹配。- suffix 参数
suffix
参数表示目标字符串结尾部分需要匹配的字符串,如果该参数是包含多个字符串的元组,那么目标字符串的结尾只需要与其中之一匹配。
Pythonstr
类型的find
方法用于返回指定字符串在目标字符串中第一次出现的位置,如果指定字符串没有出现过,则返回-1
。str
类型的rfind
方法用于返回指定字符串在目标字符串中最后一次出现的位置,如果指定字符串没有出现过,则返回-1
。str
类型的index
和rindex
方法与find
和rfind
方法类似,但会引发异常ValueError
,当指定字符串没有出现时。
find(sub[, start[, end]], /)
rfind(sub[, start[, end]], /)
index(sub[, start[, end]], /)
rindex(sub[, start[, end]], /)
- sub 参数
sub
参数表示需要查找的字符串,如果传递空字符串,则find
和index
返回的位置为0
,rfind
和rindex
返回的位置为字符串长度。
Pythonstr
类型的replace
方法用于替换目标字符串中的内容,替换后的结果会作为新的字符串返回。
replace(old, new[, count], /)
- old 参数
old
参数表示需要被替换的旧内容。如果为空字符串,则替换效果相当于在目标字符串的每个字符前插入参数new
的内容,参数new
的内容至少出现一次。- new 参数
new
参数表示替换后的新内容。- count 参数
count
参数表示替换的次数,如果未指定或小于0
,则替换次数不受限制。
Pythonstr
类型的strip
方法将移除字符串开头和结尾的字符,直到字符未出现在chars
参数中,移除后的结果会作为新的字符串返回。str
类型的lstrip
和rstrip
方法与strip
方法类似,不过lstrip
仅移除字符串开头的字符,rstrip
仅移除字符串结尾的字符。
strip([chars], /)
lstrip([chars], /)
rstrip([chars], /)
- chars 参数
chars
参数表示字符串开头,结尾,或开头与结尾处需要移除的字符。忽略该参数或设置为None
,将移除相应位置的空白字符。
Pythonstr
类型的removeprefix
方法将移除指定的字符串前缀,该运算仅运行一次,移除后的结果会作为新的字符串返回。与removeprefix
方法类似,str
类型的removesuffix
方法可移除指定的字符串后缀。
removeprefix(prefix, /)
removesuffix(suffix, /)
- prefix 参数
prefix
参数表示需要移除的字符串前缀。- suffix 参数
suffix
参数表示需要移除的字符串后缀。
'hello'.count('')
6
'hello'.endswith(('h', 'o'))
True
'hello world'.replace('l', 'L', 2)
'heLLo world'
'hello world'.strip('hdel')
'o wor'
'hellohello!'.removeprefix('hello')
'hello!'
分割和联接 Python 字符串
对于字符串的分割和联接,Python 的str
类型提供了如下方法。
Pythonstr
类型的split
方法使用指定的字符串分割目标字符串,分割的结果将作为一个列表返回。str
类型的rsplit
方法与split
方法类似,但分割会从字符串的末尾开始,需要说明的是,仅当maxsplit
参数指定的分割次数,不足以分割所有可分割的内容时,rsplit
方法的效果才能有所体现。
split(sep=None, maxsplit=-1)
rsplit(sep=None, maxsplit=-1)
- sep 参数
sep
参数表示用于分割目标字符串的字符串,他不能为空字符串。如果sep
为默认值None
,则连续的空白字符(包括空格符,换行符,制表符等)将作为分割的依据,目标字符串开始和结尾的空白字符会被忽略,因此,''.split()
返回的结果是[]
。- maxsplit 参数
maxsplit
参数默认为-1
,表示分割的最大执行次数,假如maxsplit
为2
,那么返回列表的最大长度为3
。如果maxsplit
未被指定或小于0
,则替换次数不受限制。
Pythonstr
类型的splitlines
方法使用行边界字符分割目标字符串,分割的结果将作为一个列表返回,行边界字符包括\n
,\r
,\r\n
,\v
或\x0b
,\f
或\x0c
,\x1c
,\x1d
,\x1e
,\x85
,\u2028
,\u2029
。需要指出的是,分割末尾的行边界字符不会新建一个空字符串,因此'hello\r\n'.splitlines()
返回的结果为['hello']
。
splitlines(keepends=False)
- keepends 参数
keepends
参数默认为False
,表示分割的内容不会包含边界字符,如果设置为True
,则分割内容的结尾处会包含边界字符。
Pythonstr
类型的partition
方法使用指定字符串将目标字符串分割为三部分,并作为元组返回。其中的三部分分别是,指定字符串前面的部分,指定字符串,指定字符串后面的部分。如果指定字符串未被找到,则返回的元组包含目标字符串和两个空字符串。str
类型的rpartition
方法与partition
方法类似,但分割会从字符串的末尾开始,如果指定字符串未被找到,则返回的元组包含两个空字符串和目标字符串。
partition(sep, /)
rpartition(sep, /)
- sep 参数
sep
参数表示用于分割目标字符串的字符串,他不能为空字符串。
Pythonstr
类型的join
方法将使用目标字符串联接iterable
参数中的每个字符串元素,联接的结果将作为一个列表返回。
join(iterable, /)
- iterable 参数
iterable
参数是一个迭代器对象,对象中的每个字符串元素都将被目标字符联接。
'Hello:World:!'.split(':', 1)
['Hello', 'World:!']
'\tHello World\r\n'.split()
['Hello', 'World']
'你好吗?\n还好!\r'.splitlines(keepends=True)
['你好吗?\n', '还好!\r']
'我说:你好吗?他说:不好'.rpartition('说:')
('我说:你好吗?他', '说:', '不好')
','.join(('苹果', '橘子', '还是橘子'))
'苹果,橘子,还是橘子'
Python 中的字符大小写操作
对于字符的大小写,Python 的str
类型提供了如下方法。
Pythonstr
类型的upper
方法将字符串中所有字符₁改为大写,更改后的结果会作为新的字符串返回。str
类型的lower
方法将字符串中所有字符₁改为小写,更改后的结果会作为新的字符串返回。str
类型的casefold
方法与lower
方法类似,同样是将字符串中所有字符₁改为小写,但会进行更为彻底的处理,一些具有折叠效果的小写字母会被展开,比如德语中的ß
会被展开为ss
。
upper()
lower()
casefold()
Pythonstr
类型的isupper
方法用于判断字符串中的字符₁是否全部为大写,如果是则返回True
,否则返回False
,字符串中不属于 Unicode Lu,Ll,Lt 分类的字符将被忽略。str
类型的islower
方法用于判断字符串中的字符₁是否全部为小写,如果是则返回True
,否则返回False
,字符串中不属于 Unicode Lu,Ll,Lt 分类的字符将被忽略。
isupper()
islower()
Pythonstr
类型的capitalize
方法将字符串中的第一个字符₁(并非每个单词的第一个字符₁)改为大写,其余字符₁改为小写,更改后的结果会作为新的字符串返回。在 Python 3.8 以及之后的版本中,当组合字符位于字符串的首位时,只有组合的第一个字符₁才会改为大写,组合字符的其他字符₁将改为小写。
capitalize()
Pythonstr
类型的title
方法用于将字符串中每个连续字符₁组合(组合可能并不是一个单词)改为标题格式,即组合的第一个字符₁为大写,其余字符₁为小写,更改后的结果会作为新的字符串返回。str
类型的istitle
方法用于判断字符串中每个连续字符₁组合是否符合标题格式,如果是则返回True
,否则返回False
。
title()
istitle()
Pythonstr
类型的swapcase
方法用于更改切换字符串中所有字符₁的大小写,更改后的结果会作为新的字符串返回。
swapcase()
Unicode 中的 Lu,Ll,Lt 分类不止包含英文字母字符
Unicode 中的 Lu,Ll,Lt 分类不止包含英文字母字符,还包含其他语种的大小写字符,比如意大利语。
如何将 Python 字符串中的单词首字母转换为大写?
虽然title
方法可以将连续字符₁组合的首个字符₁转换为大写,但这些组合可能并非真正的单词,比如字符串"i'm john"
中的m
。这种问题可通过string
模块的capwords
方法解决,该方法能更有效的识别单词。
'ÀÇ'.lower()
'àç'
'ß'.casefold()
'ss'
'你好!python'.islower()
True
"i'm john".capitalize()
"I'm john"
"i'm john".title()
"I'M John"
import string
string.capwords("i'm john")
"I'm John"
转换和填充 Python 字符串
对于字符串的转换和填充,Python 的str
类型提供了如下方法。
Pythonstr
类型的expandtabs
方法将字符串中的制表符转换为一个或多个空格符,数量根据制表符在当前行的位置以及制表符的宽度来决定,转换后的结果会作为新的字符串返回。
expandtabs(tabsize=8)
- tabsize 参数
tabsize
参数表示制表符的宽度,默认为8
,如果为负数,则效果等同于设置为0
。
Pythonstr
类型的center
方法将使用指定字符填充目标字符串的两边,并尽可能确保两边填充的字符数量相同,填充后的结果会作为新的字符串返回。str
类型的ljust
,rjust
方法与center
方法类似,但他们仅在目标字符串的右边,左边填充指定字符,以实现目标字符串的左对齐,右对齐效果。str
类型的zfill
方法与rjust
方法类似,但他仅填充字符0
,并使0
始终位于目标字符串首位的+
或-
之后,因此zfill
通常用于为数字填充前置0
。
center(width, fillchar=' ', /)
ljust(width, fillchar=' ', /)
rjust(width, fillchar=' ', /)
zfill(width, /)
- width 参数
width
参数表示填充后的字符串的长度,如果该参数小于等于目标字符串的长度,则调用方法不会产生任何效果。- fillchar 参数
fillchar
参数表示用于填充的内容,他只能是一个字符,默认为空格符。
'清单\r\n\t苹果\r\n\t'.expandtabs(tabsize=1)
'清单\r\n 苹果\r\n '
'快乐'.center(1, '+')
'快乐'
'快乐'.ljust(10, '-')
'快乐--------'
'-12e+3'.zfill(10)
'-000012e+3'
使用转换表转换 Python 字符串中字符
Pythonstr
类型的translate
方法将使用一个被称为转换表的对象,来转换 Python 字符串中的字符。转换表一般是一个 Python 映射对象,或者实现了__getitem__
方法的对象,他将根据目标字符串中某个字符的编码值,传回该字符对应的转换字符(可以是单个字符或多个字符)或对应转换字符的编码值,如果传回空值None
,则目标字符串中的字符会被删除,如果在传回的过程中引发了异常LookupError
,则目标字符串中的字符保持不变。
translate(table)
- table 参数
table
参数是一个用于转换字符的转换表对象。
'ABCD'.translate({65: 'a', 66: 98, 67: 'cc', 68: None})
'abcc'
如果采用字符的编码值,那么translate
方法并不容易被使用,而 Pythonstr
类型的maketrans
静态方法可方便的为translate
方法生成转换表对象。
str.maketrans(x)
- x 参数
x
参数是一个用于生成转换表对象的 Python 字典,字典键值对的键是某个字符或该字符对应的编码值,字典键值对的值是该字符对应的转换字符(可以是单个字符或多个字符),或对应转换字符的编码值,或空值None
(表示字符将被删除)。
str.maketrans(x, y[, z])
- x 参数
x
参数是一个 Python 字符串,如果一个字符出现在该字符串中,那么该字符应被转换为参数y
所表示的字符串中的同位置字符。- y 参数
y
参数是x
参数所表示的字符串对应的转换字符串,这两个字符串的长度必须相同。- z 参数
z
参数是一个 Python 字符串,如果一个字符出现在该字符串中,那么该字符将被转换为空值None
(表示字符将被删除)。
'-0.1j'.translate(str.maketrans({'-': '负数 ', '.': ' 小数点 '}))
'负数 0 小数点 1j'
'-0.1j'.translate(str.maketrans('-01', '负零一', 'j'))
'负零.一'
在下面的示例中,我们定义了一个充当转换表的 Python 类Trans
,在该类的__getitem__
方法中,如果字符是A
则引发异常LookupError
,这将导致字符A
保持不变。
# 一个转换表类
class Trans:
def __getitem__(self, key):
# 如果是 A,则保持不变
if key == 65:
raise LookupError()
# 转换为编码值加 1 的字符
return key + 1
print('ABC'.translate(Trans()))
ACD
判断 Python 字符串是否为字母或数字
对于判断是否为字母或数字字符,Python 的str
类型提供了如下方法。
Pythonstr
类型的isalpha
方法用于判断字符串中的字符是否均为字母字符₁,如果是则返回True
,否则返回False
。
isalpha()
Pythonstr
类型的isdecimal
方法用于判断字符串中的字符是否均为十进制数字字符,即 Unicode 中的 Nd 分类,如果是则返回True
,否则返回False
。str
类型的isdigit
方法用于判断字符串中的字符是否均为数字字符,即 Unicode 中 Numeric_Type 为 Digit 或 Decimal 的字符,如果是则返回True
,否则返回False
。显然isdigit
判断的范围要比isdecimal
更大,比如对于字符串'¹'
,isdecimal
返回False
,isdigit
返回True
。str
类型的isnumeric
方法用于判断字符串中的字符是否均为具有数字特征的字符,但该方法的判断范围最广,包含 Unicode 中 Numeric_Type 为 Digit, Decimal 或 Numeric 的字符。
isalpha()
isdigit()
isnumeric()
Pythonstr
类型的isalnum
方法用于判断字符串中的字符是否均为字母字符₁,或具有数字特征的字符,当isalpha
或isnumeric
之一返回True
时,isalnum
方法也会返回True
,否则返回False
。
isalnum()
Pythonstr
类型的isascii
方法用于判断字符串中的字符是否均为 ASCII 字符,如果是则返回True
(包括空字符),否则返回False
。str
类型的isidentifier
方法用于判断字符串是否是一个有效的 Python 标识符,如果是则返回True
,否则返回False
(包括空字符)。str
类型的isprintable
方法用于判断字符串中的字符是否均为可打印字符,如果是则返回True
(包括空字符),否则返回False
。str
类型的isspace
方法用于判断字符串中的字符是否均为空白字符,如果是则返回True
,否则返回False
(包括空字符)。
isascii()
isidentifier()
isprintable()
isspace()
Unicode 中的 Nd 分类不止包含 0123456789
Unicode 中的 Nd 分类不止包含0123456789
,还包含其他语种的对应形式,比如 Wancho 中的𞋰𞋱𞋲𞋳𞋴𞋵𞋶𞋷𞋸𞋹
。
Python 的 isdecimal,isdigit,isnumeric 方法只能判断字符串是否为简单数字
Python 的isdecimal
,isdigit
和isnumeric
方法只能判断字符串是否为简单数字,如果包含小数点或正负号,那么这些方法将返回False
。
'Ⅸ'.isnumeric()
True
'Ⅸ'.isdigit()
False
'¹'.isdigit()
True
'¹'.isdecimal()
False
'1234.56'.isnumeric()
False
将 Python 字符串类型转换为 bytes 类型
Pythonstr
类型的encode
方法,可以将字符串转换为bytes
类型。
encode(encoding='utf-8', errors='strict')
- encoding 参数
encoding
参数表示在编码str
对象时,所采用的编码格式,默认为'utf-8'
。- errors 参数
errors
参数表示对编码异常的处理方式,默认为'strict'
,将抛出UnicodeError
。其他的取值包括'ignore'
,'replace'
等。
'Hello'.encode()
b'Hello'