URLhttps://learnscript.net/zh/python/data-types/text-types/
    复制链接转到说明  示例

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

    我被代码海扁署名-非商业-禁演绎
    阅读 29:06·字数 8732·更新 

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

    Python 文本/字符串类型

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

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

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

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

    在下面的代码中,我们将用于生成邮箱正则表达式的字符串分成了三行,并使用()括住,否则每一行均会被认定为新的表达式。需要检测的邮箱地址被书写为"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 的len函数可用于获取字符串长度,这将调用字符串对象的__len__方法。比如,len('Hello\tWorld\r\n')的结果为13

    如何反转字符串?

    使用切片表达式::-1可以反转字符串,比如,'Hello'[::-1]的结果为'olleH'。或者,先使用reversed函数将字符串转换为一个顺序反转的迭代器对象,然后使用str类型的join方法将迭代器对象联接为字符串,比如,''.join(reversed('Hello'))的结果为'olleH'

    序列类型

    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一般是一个类字节序列对象,参数encodingerrors被用于类字节序列对象的解码操作,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

    如何禁止字符串中的 \ 成为转义字符?

    使用原始字符串,即以rR为前缀的字符串,可以禁止\成为转义字符。在一些特殊情况下这非常有效,比如包含文件路径的字符串,因为你不必再将路径中的每个\转义为\\

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

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

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

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

    转义

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

    格式化 Python 字符串

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

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

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

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

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

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

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

    sub 参数

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

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

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

    prefix 参数

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

    suffix 参数

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

    str类型的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返回的位置为字符串长度。

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

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

    old 参数

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

    new 参数

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

    count 参数

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

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

    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保持不变。

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

    isalpha()
    isdigit()
    isnumeric()

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

    isalnum()

    str类型的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 中的𞋰𞋱𞋲𞋳𞋴𞋵𞋶𞋷𞋸𞋹

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

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

    使用intfloatcomplex类型的构造器,可以将表示数字的字符串转换为整数,浮点数,复数,你可以查看转换 Python 数字类型与字符串类型一段来了解相关信息。

    当然,在使用数字类型的构造器时,需要确保字符串所表示的数字是合理的,否则可能会引发异常,比如,在使用int整数类型的构造器时,传递字符串'1.23'

    此外,intfloatcomplex类型的构造器不能转换空字符串''或空值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