Python 文本/字符串类型 str 使用说明

我被代码海扁署名-非商业-禁演绎
阅读 27:44·字数 8323·更新 
Bilibili 空间
关注 960

本节的“字符₁”一词是指 Unicode 中 Lu,Ll,Lt 分类的字符,“字母字符₁”一词是指 Unicode 中 Lu,Ll,Lt,Lm,Lo 分类的字符。

Python 文本/字符串类型

Python 中的文本/字符串类型str继承自序列类型Sequence,用于表示文字信息,其字面量的书写需要使用成对的引号,这包括单引号('),双引号("),三重单引号('''),三重双引号("""),其中三重引号可接受多行的文字信息。

将 Python 字符串的字面量分为多个部分

多个紧密相邻或使用空白(包括空格,换行等)分隔的字符串字面量,将等同于一个字符串字面量,这种效果可以让你为字符串的不同部分分别注释,从而使各部分的作用更容易被理解。

需要指出,当被分隔的字符串字面量可能位于多个表达式中时,应使用()将他们括住。

在下面的代码中,我们将用于生成邮箱正则表达式的字符串分成了三行,并使用()括住,否则每一行均会被认定为新的表达式。需要检测的邮箱地址被书写为"xiao_xiao" '@' '''live.com''',他等同于'xiao_xiao@live.com'

concatenate.py
# 一个用于生成邮箱正则表达式的字符串
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一般是一个类字节序列对象,参数encodingerrors被用于类字节序列对象的解码操作,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 原始字符串,即以rR为前缀的字符串,可以禁止\成为转义字符。在一些特殊情况下这非常有效,比如包含文件路径的字符串,因为你不必再将路径中的每个\转义为\\

需要指出的是,虽然 Python 原始字符串不会将\视为转义字符,但单个\不能出现在字符串的结尾,这意味着如果字符串以单个\结束,那么使用 Python 原始字符串将导致错误,比如r'C:\python\'

R'C:\python\3.14'
'C:\\python\\3.14'

Python 字符串中无法识别的转义序列将导致异常或警告

在 Python 3.6 或更高的版本中,Python 字符串中无法被识别的转义序列将导致异常或警告,而在之前的版本中,转义字符\将被保留。

转义

关于转义,转义字符,转义序列等基本概念,你可以查看编程教程转义,转义字符,转义序列介绍一节了解更多。

格式化 Python 字符串

Python 的str类型提供了formatformat_map方法,用于对字符串进行格式化。

format方法使用可变参数kwargs替换字符串中的可替换项,可替换项使用{}{n}表示,其中n为可变参数kwargs的索引。

format_map方法使用字典参数mapping替换字符串中的可替换项,可替换项使用{n}表示,其中n为字典的键。

查找和替换 Python 字符串中的内容

对于字符串的查找和替换,Python 的str类型提供了众多的方法,这些方法一般包含startend参数,他们被用于切片操作,以针对字符串中的某一部分进行运算,如果未指定startend参数,则运算会针对整个字符串。

Pythonstr类型的count方法用于获取指定字符串在目标字符串中出现的次数。

count(sub[, start[, end]], /)

sub 参数

sub参数表示需要查找的字符串,如果传递空字符串,则返回的次数为字符串长度加1

Pythonstr类型的startswith方法用于判断字符串是否以指定的字符串开始,如果是则返回True,否则返回Falsestr类型的endswith方法用于判断字符串是否以指定的字符串结束,如果是则返回True,否则返回False

startswith(prefix[, start[, end]], /)
endswith(suffix[, start[, end]], /)

prefix 参数

prefix参数表示目标字符串开头部分需要匹配的字符串,如果该参数是包含多个字符串的元组,那么目标字符串的开头只需要与其中之一匹配。

suffix 参数

suffix参数表示目标字符串结尾部分需要匹配的字符串,如果该参数是包含多个字符串的元组,那么目标字符串的结尾只需要与其中之一匹配。

Pythonstr类型的find方法用于返回指定字符串在目标字符串中第一次出现的位置,如果指定字符串没有出现过,则返回-1str类型的rfind方法用于返回指定字符串在目标字符串中最后一次出现的位置,如果指定字符串没有出现过,则返回-1str类型的indexrindex方法与findrfind方法类似,但会引发异常ValueError,当指定字符串没有出现时。

find(sub[, start[, end]], /)
rfind(sub[, start[, end]], /)
index(sub[, start[, end]], /)
rindex(sub[, start[, end]], /)

sub 参数

sub参数表示需要查找的字符串,如果传递空字符串,则findindex返回的位置为0rfindrindex返回的位置为字符串长度。

Pythonstr类型的replace方法用于替换目标字符串中的内容,替换后的结果会作为新的字符串返回。

replace(old, new[, count], /)

old 参数

old参数表示需要被替换的旧内容。如果为空字符串,则替换效果相当于在目标字符串的每个字符前插入参数new的内容,参数new的内容至少出现一次。

new 参数

new参数表示替换后的新内容。

count 参数

count参数表示替换的次数,如果未指定或小于0,则替换次数不受限制。

Pythonstr类型的strip方法将移除字符串开头和结尾的字符,直到字符未出现在chars参数中,移除后的结果会作为新的字符串返回。str类型的lstriprstrip方法与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,表示分割的最大执行次数,假如maxsplit2,那么返回列表的最大长度为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类型的ljustrjust方法与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保持不变。

lookup.py
# 一个转换表类
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,否则返回Falsestr类型的isdigit方法用于判断字符串中的字符是否均为数字字符,即 Unicode 中 Numeric_Type 为 Digit 或 Decimal 的字符,如果是则返回True,否则返回False。显然isdigit判断的范围要比isdecimal更大,比如对于字符串'¹'isdecimal返回Falseisdigit返回Truestr类型的isnumeric方法用于判断字符串中的字符是否均为具有数字特征的字符,但该方法的判断范围最广,包含 Unicode 中 Numeric_Type 为 Digit, Decimal 或 Numeric 的字符。

isalpha()
isdigit()
isnumeric()

Pythonstr类型的isalnum方法用于判断字符串中的字符是否均为字母字符₁,或具有数字特征的字符,当isalphaisnumeric之一返回True时,isalnum方法也会返回True,否则返回False

isalnum()

Pythonstr类型的isascii方法用于判断字符串中的字符是否均为 ASCII 字符,如果是则返回True(包括空字符),否则返回Falsestr类型的isidentifier方法用于判断字符串是否是一个有效的 Python 标识符,如果是则返回True,否则返回False(包括空字符)。str类型的isprintable方法用于判断字符串中的字符是否均为可打印字符,如果是则返回True(包括空字符),否则返回Falsestr类型的isspace方法用于判断字符串中的字符是否均为空白字符,如果是则返回True,否则返回False(包括空字符)。

isascii()
isidentifier()
isprintable()
isspace()

Unicode 中的 Nd 分类不止包含 0123456789

Unicode 中的 Nd 分类不止包含0123456789,还包含其他语种的对应形式,比如 Wancho 中的𞋰𞋱𞋲𞋳𞋴𞋵𞋶𞋷𞋸𞋹

Python 的 isdecimal,isdigit,isnumeric 方法只能判断字符串是否为简单数字

Python 的isdecimalisdigitisnumeric方法只能判断字符串是否为简单数字,如果包含小数点或正负号,那么这些方法将返回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'

内容分类

源码

src/zh/data_types/text_types·codebeatme/python·GitHub