Python 文本/字符串类型 str 使用说明
关注 1800
本节的“字符₁”一词是指 Unicode 中 Lu,Ll,Lt 分类的字符,“字母字符₁”一词是指 Unicode 中 Lu,Ll,Lt,Lm,Lo 分类的字符。
Python 文本/字符串类型
Python 中的文本/字符串类型str继承自序列类型Sequence,用于表示文字信息,其字面量的书写需要使用成对的引号,这包括单引号('),双引号("),三重单引号('''),三重双引号("""),其中三重引号可接受多行的文字信息。
将字符串的字面量分为多个部分
多个紧密相邻或使用空白(包括空格,换行等)分隔的字符串字面量,将等同于一个字符串字面量,这种效果可以让你为字符串的不同部分分别注释,从而使各部分的作用更容易被理解。
需要指出,当被分隔的字符串字面量可能位于多个表达式中时,应使用()将他们括住。
在下面的代码中,我们将用于生成邮箱正则表达式的字符串分成了三行,并使用()括住,否则每一行均会被认定为新的表达式。需要检测的邮箱地址被书写为"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 的len函数可用于获取字符串长度,这将调用字符串对象的__len__方法。比如,len('Hello\tWorld\r\n')的结果为13。
如何获取 Python 字符串的长度视频演示 YouTube如何获取 Python 字符串的长度视频演示 Bilibili
如何反转字符串?
使用切片表达式::-1可以反转字符串,比如,'Hello'[::-1]的结果为'olleH'。或者,先使用reversed函数将字符串转换为一个顺序反转的迭代器对象,然后使用str类型的join方法将迭代器对象联接为字符串,比如,''.join(reversed('Hello'))的结果为'olleH'。
如何反转 Python 字符串的顺序视频演示 YouTube如何反转 Python 字符串的顺序视频演示 Bilibili
序列类型
str类型拥有 Python 序列类型的通用功能,你可以查看Python 序列类型 list,tuple,range 使用说明一节了解相关信息。
创建 Python 字符串
除了使用字面量,你还可以通过str类型的构造器来创建字符串,他的形式如下。
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__ 方法
对象的__str__方法,返回对象非正式的字符串表达形式,这意味着__str__返回的内容更有利于非开发人员的阅读。
对象的__repr__方法,返回对象正式的字符串表达形式,这种形式通常包含了对象中的数据,可用于辅助开发人员的调试工作。
转义 Python 字符串中的字符
与大部分编程语言一样,字符串同样将字符\作为转义字符,比如'\tHello'中的\,以下是一些常见的转义序列。
转义序列 表示内容 \\ 反斜杠 \' 单引号 \" 双引号 \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如何禁止字符串中的 \ 成为转义字符?
使用原始字符串,即以r或R为前缀的字符串,可以禁止\成为转义字符。在一些特殊情况下这非常有效,比如包含文件路径的字符串,因为你不必再将路径中的每个\转义为\\。
需要指出的是,虽然原始字符串不会将\视为转义字符,但单个\不能出现在字符串的结尾,这意味着如果字符串以单个\结束,那么使用原始字符串将导致错误,比如r'C:\python\'。
R'C:\python\3.14'
'C:\\python\\3.14'字符串中无法识别的转义序列将导致异常或警告
在 Python 3.6 或更高的版本中,字符串中无法被识别的转义序列将导致异常或警告,而在之前的版本中,转义字符\将被保留。
转义
关于转义,转义字符,转义序列等基本概念,你可以查看编程教程的转义,转义字符,转义序列介绍一节了解更多。
格式化 Python 字符串
str类型提供了format和format_map方法,用于对字符串进行格式化。
format方法使用可变参数kwargs替换字符串中的可替换项,可替换项使用{}或{n}表示,其中n为可变参数kwargs的索引。
format_map方法使用字典参数mapping替换字符串中的可替换项,可替换项使用{n}表示,其中n为字典的键。
查找和替换 Python 字符串中的内容
对于字符串的查找和替换,str类型提供了众多的方法,这些方法一般包含start和end参数,他们被用于切片操作,以针对字符串中的某一部分进行运算,如果未指定start和end参数,则运算会针对整个字符串。
str类型的count方法用于获取指定字符串在目标字符串中出现的次数。
count(sub[, start[, end]], /)
- sub 参数
sub参数表示需要查找的字符串,如果传递空字符串,则返回的次数为字符串长度加1。
str类型的startswith方法用于判断字符串是否以指定的字符串开始,如果是则返回True,否则返回False。str类型的endswith方法用于判断字符串是否以指定的字符串结束,如果是则返回True,否则返回False。
startswith(prefix[, start[, end]], /)
endswith(suffix[, start[, end]], /)
- prefix 参数
prefix参数表示目标字符串开头部分需要匹配的字符串,如果该参数是包含多个字符串的元组,那么目标字符串的开头只需要与其中之一匹配。- suffix 参数
suffix参数表示目标字符串结尾部分需要匹配的字符串,如果该参数是包含多个字符串的元组,那么目标字符串的结尾只需要与其中之一匹配。
str类型的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返回的位置为字符串长度。
str类型的replace方法用于替换目标字符串中的内容,替换后的结果会作为新的字符串返回。
replace(old, new[, count], /)
- old 参数
old参数表示需要被替换的旧内容。如果为空字符串,则替换效果相当于在目标字符串的每个字符前插入参数new的内容,参数new的内容至少出现一次。- new 参数
new参数表示替换后的新内容。- count 参数
count参数表示替换的次数,如果未指定或小于0,则替换次数不受限制。
str类型的strip方法将移除字符串开头和结尾的字符,直到字符未出现在chars参数中,移除后的结果会作为新的字符串返回。str类型的lstrip和rstrip方法与strip方法类似,不过lstrip仅移除字符串开头的字符,rstrip仅移除字符串结尾的字符。
strip([chars], /)
lstrip([chars], /)
rstrip([chars], /)
- chars 参数
chars参数表示字符串开头,结尾,或开头与结尾处需要移除的字符。忽略该参数或设置为None,将移除相应位置的空白字符。
str类型的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 字符串
对于字符串的分割和联接,str类型提供了如下方法。
str类型的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,则替换次数不受限制。
str类型的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,则分割内容的结尾处会包含边界字符。
str类型的partition方法使用指定字符串将目标字符串分割为三部分,并作为元组返回。其中的三部分分别是,指定字符串前面的部分,指定字符串,指定字符串后面的部分。如果指定字符串未被找到,则返回的元组包含目标字符串和两个空字符串。str类型的rpartition方法与partition方法类似,但分割会从字符串的末尾开始,如果指定字符串未被找到,则返回的元组包含两个空字符串和目标字符串。
partition(sep, /)
rpartition(sep, /)
- sep 参数
sep参数表示用于分割目标字符串的字符串,他不能为空字符串。
str类型的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 中的字符大小写操作
对于字符的大小写,str类型提供了如下方法。
str类型的upper方法将字符串中所有字符₁改为大写,更改后的结果会作为新的字符串返回。str类型的lower方法将字符串中所有字符₁改为小写,更改后的结果会作为新的字符串返回。str类型的casefold方法与lower方法类似,同样是将字符串中所有字符₁改为小写,但会进行更为彻底的处理,一些具有折叠效果的小写字母会被展开,比如德语中的ß会被展开为ss。
upper()
lower()
casefold()
str类型的isupper方法用于判断字符串中的字符₁是否全部为大写,如果是则返回True,否则返回False,字符串中不属于 Unicode Lu,Ll,Lt 分类的字符将被忽略。str类型的islower方法用于判断字符串中的字符₁是否全部为小写,如果是则返回True,否则返回False,字符串中不属于 Unicode Lu,Ll,Lt 分类的字符将被忽略。
isupper()
islower()
str类型的capitalize方法将字符串中的第一个字符₁(并非每个单词的第一个字符₁)改为大写,其余字符₁改为小写,更改后的结果会作为新的字符串返回。在 Python 3.8 以及之后的版本中,当组合字符位于字符串的首位时,只有组合的第一个字符₁才会改为大写,组合字符的其他字符₁将改为小写。
capitalize()
str类型的title方法用于将字符串中每个连续字符₁组合(组合可能并不是一个单词)改为标题格式,即组合的第一个字符₁为大写,其余字符₁为小写,更改后的结果会作为新的字符串返回。str类型的istitle方法用于判断字符串中每个连续字符₁组合是否符合标题格式,如果是则返回True,否则返回False。
title()
istitle()
str类型的swapcase方法用于更改切换字符串中所有字符₁的大小写,更改后的结果会作为新的字符串返回。
swapcase()
Unicode 中的 Lu,Ll,Lt 分类不止包含英文字母字符
Unicode 中的 Lu,Ll,Lt 分类不止包含英文字母字符,还包含其他语种的大小写字符,比如意大利语。
如何将字符串中的单词首字母转换为大写?
虽然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 字符串
对于字符串的转换和填充,str类型提供了如下方法。
str类型的expandtabs方法将字符串中的制表符转换为一个或多个空格符,数量根据制表符在当前行的位置以及制表符的宽度来决定,转换后的结果会作为新的字符串返回。
expandtabs(tabsize=8)
- tabsize 参数
tabsize参数表示制表符的宽度,默认为8,如果为负数,则效果等同于设置为0。
str类型的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 字符串中字符
str类型的translate方法将使用一个被称为转换表的对象,来转换字符串中的字符。转换表一般是一个映射对象,或者实现了__getitem__方法的对象,他将根据目标字符串中某个字符的编码值,传回该字符对应的转换字符(可以是单个字符或多个字符)或对应转换字符的编码值,如果传回空值None,则目标字符串中的字符会被删除,如果在传回的过程中引发了异常LookupError,则目标字符串中的字符保持不变。
translate(table)
- table 参数
table参数是一个用于转换字符的转换表对象。
'ABCD'.translate({65: 'a', 66: 98, 67: 'cc', 68: None})
'abcc'如果采用字符的编码值,那么translate方法并不容易被使用,而str类型的maketrans静态方法可方便的为translate方法生成转换表对象。
str.maketrans(x)
- x 参数
x参数是一个用于生成转换表对象的字典,字典键值对的键是某个字符或该字符对应的编码值,字典键值对的值是该字符对应的转换字符(可以是单个字符或多个字符),或对应转换字符的编码值,或空值None(表示字符将被删除)。
str.maketrans(x, y[, z])
- x 参数
x参数是一个字符串,如果一个字符出现在该字符串中,那么该字符应被转换为参数y所表示的字符串中的同位置字符。- y 参数
y参数是x参数所表示的字符串对应的转换字符串,这两个字符串的长度必须相同。- z 参数
z参数是一个字符串,如果一个字符出现在该字符串中,那么该字符将被转换为空值None(表示字符将被删除)。
'-0.1j'.translate(str.maketrans({'-': '负数 ', '.': ' 小数点 '}))
'负数 0 小数点 1j'
'-0.1j'.translate(str.maketrans('-01', '负零一', 'j'))
'负零.一'在下面的示例中,我们定义了一个充当转换表的类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 字符串是否为字母或数字
对于判断是否为字母或数字字符,str类型提供了如下方法。
str类型的isalpha方法用于判断字符串中的字符是否均为字母字符₁,如果是则返回True,否则返回False。
isalpha()
str类型的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()
str类型的isalnum方法用于判断字符串中的字符是否均为字母字符₁,或具有数字特征的字符,当isalpha或isnumeric之一返回True时,isalnum方法也会返回True,否则返回False。
isalnum()
str类型的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 中的𞋰𞋱𞋲𞋳𞋴𞋵𞋶𞋷𞋸𞋹。
isdecimal,isdigit,isnumeric 方法只能判断字符串是否为简单数字
Python 的isdecimal,isdigit和isnumeric方法只能判断字符串是否为简单数字,如果包含小数点或正负号,那么这些方法将返回False。
'Ⅸ'.isnumeric()
True
'Ⅸ'.isdigit()
False
'¹'.isdigit()
True
'¹'.isdecimal()
False
'1234.56'.isnumeric()
False将 Python 字符串类型转换为 bytes 类型
str类型的encode方法,可以将字符串转换为bytes类型。
encode(encoding='utf-8', errors='strict')
- encoding 参数
encoding参数表示在编码str对象时,所采用的编码格式,默认为'utf-8'。- errors 参数
errors参数表示对编码异常的处理方式,默认为'strict',将抛出UnicodeError。其他的取值包括'ignore','replace'等。
'Hello'.encode()
b'Hello'内容分类
常见问题
如何将 Python str 字符串类型转换为 int 整数,float 浮点数,complex 复数类型?
如何将 Python 字符串转换为 int、float、complex 类型视频演示 YouTube如何将 Python 字符串转换为 int、float、complex 类型视频演示 Bilibili
使用int,float,complex类型的构造器,可以将表示数字的字符串转换为整数,浮点数,复数,你可以查看转换 Python 数字类型与字符串类型一段来了解相关信息。
当然,在使用数字类型的构造器时,需要确保字符串所表示的数字是合理的,否则可能会引发异常,比如,在使用int整数类型的构造器时,传递字符串'1.23'。
此外,int,float,complex类型的构造器不能转换空字符串''或空值None。
int('123')
123
float('123.456')
123.456
complex('1+2.3j')
(1+2.3j)
# ERROR 不能转换空字符串
int('')
…
ValueError: invalid literal for int() with base 10: ''源码
src/zh/data_types/text_types·codebeatme/python·GitHub
src/zh/data_types/text_types/faq·codebeatme/python·GitHub
讲解视频
如何获取 Python 字符串的长度·YouTube如何获取 Python 字符串的长度·Bilibili
如何反转 Python 字符串的顺序·YouTube如何反转 Python 字符串的顺序·Bilibili
如何将 Python 字符串转换为 int、float、complex 类型·YouTube如何将 Python 字符串转换为 int、float、complex 类型·Bilibili