01 字符串编码转换
字符串编码的本质可以看作是二进制数据与语言文字之间的一种映射或对应关系。它是将字符(不仅仅是语言文字,还包括标点符号、控制字符等)转换成一种标准化的二进制表示形式,以便计算机能够存储、处理和传输这些信息。
1.1 编码格式
(1)ASCII编码
字符串的编码起源于ASCII(美国标准信息交换码),由于计算机技术的初始发展主要在美国,因此最初的ASCII编码仅涵盖了127个字符,包括大小写英文字母、数字以及一些常用符号。比如,大写字母'A’的编码为65,小写字母'a’的编码为97。为了满足更多字符表示的需求,随后发展了扩展ASCII编码,增加了额外的128个字符,进一步丰富了字符集的范围。
特点:仅对10个数字(0-9)、26个大写英文字母(A-Z)、26个小写英文字母(a-2)以及一些其他符号(如标点符号、控制字符等)进行了编码。
(2)GB2312 / GBK编码
由于每个国家的语言都有其独特的字符集,AScII编码作为最初的字符编码标准,无法满足中文等其他语言的表示需求。特别是中文,由于其庞大的字符数量(包括汉字、标点符号、拼音等),一个字节(8位)的编码范围(0-255,即256个字符)远远不足以覆盖所有的中文字符。因此,为了在计算机中有效地表示和显示中文字符,中国制定了GB2312编码标准。GB2312是一个扩展的字符编码标准,它采用了两个字节(16位)来表示一个字符,从而大大扩展了可表示的字符范围。这样,GB2312就能够包含数干个常用的中文字符、标点符号以及其他一些特殊符号。GB2312虽然大大扩展了字符表示的范围,但仍不能完全覆盖所有中文字符,特别是那些不常用的字和繁体中文字符。为了克服GB2312的局限性,GB2312编码逐渐被一些更全面的编码标准所取代,如GBK、GB18030等。
特点:GBK 和GB2312等是我国制定的中文编码标准,它们兼容ASCII编码,使用一个字节表示英文字符(包括大小写字母、数字及标点符号),同时扩展使用两个字节来表示丰富的中文字符。
(3)Unicode编码(万国码)
由于全世界存在上百种语言,每种语言都有其独特的字符集和编码标准,这导致了在多种语言混合的文本中可能出现编码冲突和乱码的问题。为了解决这个问题,unicode编码应运而生。
特点:unicode编码是一种统一的字符编码系统,用于表示世界上几乎所有的字符。在大多数情况下,unicode字符可以被编码为2个字节,但对于某些非常偏僻或特殊的字符,可能需要使用4个字节来表示。
(4)UTF-8编码(可变长编码)
尽管Unicode编码为全球字符的统一表示提供了解决方案,但在处理主要由英文字符组成的文本时,其固定的编码长度可能导致存储空间的不必要浪费。为了更有效地利用空间,特别是针对包含大量英文字符的文本,于是产生了UTF-8编码。
特点:UTF-8是国际通用的编码方式。常用的英文字符和标点符号仅占用1个字节,多数欧洲语言的字符需要2个字节,而中文字符等则通常是3个字节,只有极少数非常生僻的字符才会被编码为4个字节。因此,在传输或存储包含大量英文字符的文本时,采用 uTF-8编码能够显著节省存储空间。
1.2 字符串编码转换
在Python中,str(字符串)和bytes(字节,二进制数据)是两种基础且常用的数据类型,它们各自扮演着不同的角色。str类型主要用于文本数据的处理,它以Unicode编码在内存中表示,这使得它能够表示世界上几乎所有的字符集。而bytes类型则直接对应于计算机中的二进制数据,常用于文件操作、网络通信等场景。
str和bytes类型之间不能直接进行拼接或混合使用,因为它们代表了不同的数据层面:str是人类可读的文本形式,而bytes是计算机底层的二进制数据表示。当需要将文本数据(str)在网络中传输或保存到磁盘时,必须先将其转换为二进制形式(bytes),因为网络协议和文件系统通常都是以字节为单位进行数据传输和存储的。
1.2.1 encode()编码和decode()解码
将字符串(str)转换为指定编码的字节串(bytes)。转换时,字符串中的每个字符按照指定的编码方式被映射为一系列的字节。默认情况下,Python使用UTF-8编码进行转换,但也可以指定其他编码,如GBK,ASCII等。
# 字符串 st = "你今天真帅!" # 转换为utf-8编码的字节序列 utf8_bytes = st.encode("utf-8") # 输出结果及类型 print(utf8_bytes, type(utf8_bytes))# utf-8编码的字节序列 utf8_bytes = b'\xe4\xbd\xa0\xe4\xbb\x8a\xe5\xa4\xa9\xe7\x9c\x9f\xe5\xb8\x85\xef\xbc\x81' # 解码为字符串 str = utf8_bytes.decode("utf-8") print(str, type(str))注意:在进行编码转换时,必须确保使用的编码方式与原始数据的编码方式相匹配,否则可能会导致数据损坏或解码错误。
02 字符串运算
| 操作符 | 描述 | 实例 |
| + | 字符串连接 | a + b 输出结果:Hello Python |
| * | 重复输出字符串 | a * 2 输出结果:Hello Hello |
| [] | 通过索引获取字符串中字符 | a[1] 输出结果:e |
| [ : ] | 截取字符串中的一部分 | a[1:4] 输出结果:ell |
| in | 成员运算符——如果字符串中包含给定的字符返回True | H in a 输出结果:True |
| not in | 成员运算符——如果字符串中不包含给定的字符返回True | Z not in a 输出结果:True |
| r / R | 原始字符串——所有的字符串都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。原始字符串除在字符串的第一个引号前加上字母"r”(可以大小写)以外,与普通字符串有着几乎完全相同的语法。 |
str1 = "Hello" str2 = "Python" # 字符串运算符 + print(str1 + str2) # HelloPython # 算数运算符 + print(1 + 1) # 2 # 字符串运算符 * print(str1 * 2) # HelloHello # 字符串运算符 in print('e' in str1) # True # 字符串运算符 not in print('c' not in str1) # True print('e' not in str1) # False print("el" not in str1) # False print('ac' not in str1) # True # 字符串运算符 r / R print(r'\n') print(R'\n')2.1 字符串运算符[]
在Python中,索引(下标)用于快速定位并获取字符串中特定位置的元素。
| 字符串 | a | b | c | d | e | f | g | h | i |
| 正序 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 倒序 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
# 字符串运算符[] print(str1[0]) # H print(str1[1]) # e print(str1[2]) # l print(str1[3]) # l print(str1[4]) # o print(str1[-1]) # o print(str1[-2]) # l print(str1[-3]) # l print(str1[-4]) # e print(str1[-5]) # H2.2 字符串运算符[:]
在Python中,切片是一种非常有用的操作,它允许你获取序列如字符串、列表、元组)中的一部分元素。切片操作通过指定序列的起始索引、结束索引和步长来实现,返回一个新的序列,包含原序列中指定范围内的元素。
基本语法格式:
seq[start:stop:step]
- start(可选):切片的起始索引(包含),如果省略,则默认为序列的开头;
- stop(可选):切片的起始索引(不包含),如果省略,则默认为序列的结尾;
- step(可选):切片时的步长,如果省略,则默认为1。步长的绝对值大小决定切取数据的间隔,正负号决定切取方向。正数表示从左往右取值,负数表示从右往左取值。
str1 = "HelloPython" # 字符串运算符[:] print(str1[::]) # HelloPython print(str1[2:5:]) # llo print(str1[::2]) # Hloyhn print(str1[::-1]) # nohtyPolleH03 字符串常见内置函数
3.1 查找元素
3.1.1 find(sub, start, end)
查找子字符串在字符串中首次出现的位置。如果找到了子字符串,则返回该子字符串首次出现的索引。如果没有找到,则返回-1。
基本语法格式:
str.find(sub[, start[, end]])
- sub:要查找的子字符串
- start(可选):开始查找的位置。如果省略,则从字符串的开头开始查找。
- end(可选):结束查找的位置。字符串的查找会在这个位置之前停止。如果省略,则查找会一直进行到字符串的末尾。
str1 = "HelloPython" # 查找字符串 print(str1.find("l")) # 2 print(str1.find("llo")) # 2 print(str1.find("to")) # -1 print(str1.find("P", 2)) # 5 print(str1.find("l", 0, 2)) # -1 print(str1.find("e", 0, 2)) # 13.1.2 index(sub, start, end)
查找子字符串在字符串中首次出现的位置。如果找到了子字符串,则返回该子字符串首次出现的索引;如果没有找到,则抛出一个ValueError异常。
基本语法格式:
str.index(sub[, start[, end]])
- sub:要查找的子字符串
- start(可选):开始查找的位置。如果省略,则从字符串的开头开始查找。
- end(可选):结束查找的位置。字符串的查找会在这个位置之前停止。如果省略,则查找会一直进行到字符串的末尾。
str1 = "HelloPython" # 查找字符串 print(str1.index("l")) # 2 print(str1.index("llo")) # 2 print(str1.index("to")) # ValueError: substring not found print(str1.index("P", 2)) # 5 print(str1.index("l", 0, 2)) # ValueError: substring not found print(str1.index("e", 0, 2)) # 13.1.3 count(sub, start, end)
统计子字符串在字符串中出现的次数。如果子字符串在字符串中不存在,则返回0。
基本语法格式:
str.count(sub[, start[, end]])
- sub:要查找的子字符串
- start(可选):开始查找的位置。如果省略,则从字符串的开头开始查找。
- end(可选):结束查找的位置。字符串的查找会在这个位置之前停止。如果省略,则查找会一直进行到字符串的末尾。
str1 = "HelloPython" # 统计字符串 print(str1.count("l")) # 2 print(str1.count("llo")) # 1 print(str1.count("to")) # 0 print(str1.count("P", 2)) # 1 print(str1.count("l", 0, 2)) # 0 print(str1.count("e", 0, 2)) # 13.2 修改元素
3.2.1 replace(old, new, count)
替换字符串中的某些部分。
基本语法格式:
str.replace(old, new[, count])
- old:需要被替换掉的子字符串。
- new:用于替换old的新字符串。
- count(可选):指定替换的最大次数。如果省略此参数或其值小于0,则替换操作将进行到底,即替换所有匹配的子字符串。如果指定了count的值,则只替换前count次出现的old。
str1 = "HelloWorld,HelloPython" # 替换字符串 print(str1.replace("Hello", "Hi")) # HiWorld,HiPython print(str1.replace("Hello", "Hi", 1)) # HiWorld,HelloPython3.2.2 split(sep, maxsplit)
将字符串分割成列表中的子字符串。默认情况下,会根据任何空白字符(如空格、换行符\n、制表符\t等)来分割字符串,也可以通过指定一个分隔符来改变分割行为。
基本语法格式:
str.split(sep = None, maxsplit = -1)
- sep:分隔符,默认为None,表示使用空白字符作为分隔符。如果指定了其他字符串作为分隔符,则该方法会在这个指定的分隔符处分割字符串。
- maxsplit:可选参数,指定分割的最大次数。默认为-1,表示分割次数没有限制,即分割所有可能的子字符串。如果指定了非负整数n,则字符串只会被分割n次,并生成一个包含n+1个元素的列表。
str1 = "Hello World, Hello Python" # 分割字符串 print(str1.split()) # "Hello" "World," "Hello" "Python" print(str1.split(",")) # "Hello World" "Hello Python" print(str1.split("@")) # "Hello World, Hello Python" print(str1.split(" ", 1)) # "Hello" "World, Hello Python"3.2.3 strip(chars)
去除字符串首尾的指定字符(默认情况下是去除空白字符,包括空格、换行符\n、制表符\t等)。
基本语法格式:
str.strip([chars])
- chars(可选):要从字符串开头和末尾去除的字符集合。如果未指定,将去除所有空白字符。chars的参数是一个字符串,包含要从原字符串中去除的字符。strip方法会去除字符串开头和末尾出现的chars中的任意字符,直到遇到不在chars中的字符为止。
str1 = " Hello Python " str2 = "xxxxxxHello Pythonxxxxxx" str3 = "xxyxxyHello Pythonyyyxxx" str4 = "PxyyxPHello PythonxPPyyP" # 去除字符串 print(str1.strip()) # Hello Python print(str2.strip("x")) # Hello Python print(str3.strip("xy")) # Hello Python print(str4.strip("xyP")) # Hello Python3.2.4 lower()
将字符串中的所有大写字母转换为小写字母。
基本语法格式:
str.lower()
str1 = "Hello Python" print(str1.lower())3.2.5 upper()
将字符串中的所有小写字母转换为大写字母。
基本语法格式:
str.upper()
str1 = "Hello Python" print(str1.upper())3.3 判断元素
3.3.1 startswith(prefix[, start[, end]])
检查字符串是否以指定的前缀开始。如果字符串以指定的前缀开始,则返回True;否则返回False。
基本语法格式:
str.startswith(prefix[, start[, end]])
- prefix:要检查的前缀。
- start(可选):开始检查的位置,如果省略,则从字符串的开头开始检查。
- end(可选):结束检查位置。字符串的检查会在这个位置之前停止。如果省略,则检查会一直进行到字符串的末尾。
str1 = "Hello Python" # 字符串的检查 print(str1.startswith("H")) # True print(str1.startswith("Hello")) # True print(str1.startswith("Heloo")) # False print(str1.startswith("llo", 1)) # False print(str1.startswith("H", 0, 6)) # True print(str1.startswith("H", 1, 6)) # False3.3.2 endwith(suffix[, start[, end]])
检查字符串是否以指定的前缀开始。如果字符串以指定的前缀开始,则返回True;否则返回False。
基本语法格式:
str.startswith(suffix[, start[, end]])
- suffix:要检查的后缀。
- start(可选):开始检查的位置,如果省略,则从字符串的开头开始检查。
- end(可选):结束检查位置。字符串的检查会在这个位置之前停止。如果省略,则检查会一直进行到字符串的末尾。
str1 = "Hello Python!" # 字符串的检查 print(str1.endswith("!")) # True print(str1.endswith("n!")) # True print(str1.endswith("on")) # False print(str1.endswith("!", 3)) # True print(str1.endswith("llo", 0, 5)) # True print(str1.endswith("on!", 1, 13)) # True3.3.3 isupper()
检查字符串中的所有可识别的字母字符是否都是大写。如果字符串中至少有一个可识别的字母字符,并且所有这些字母字符都是大写,则返回True。如果字符串为空、不包含任何字母字符,或者包含至少一个小写字母字符,则返回False。
基本语法格式:
str.isupper()
str1 = "Hello Python!" str2 = "HELLO PYTHON!" str3 = " " str4 = "PYTHON 3.1" # 字符串是否全为大写的检查 print(str1.isupper()) # False print(str2.isupper()) # True print(str3.isupper()) # False print(str4.isupper()) # True3.3.4 islower()
检查字符串中的所有可识别的字母字符是否都是小写。如果字符串中至少有一个可识别的字母字符,并且所有这些字母字符都是小写,则返回True。如果字符串为空、不包含任何字母字符,或者包含至少一个大写字母字符,则返回False。
基本语法格式:
str.islower()
str1 = "Hello Python!" str2 = "hello python!" str3 = " " str4 = "python 3.1" # 字符串是否全为大写的检查 print(str1.islower()) # False print(str2.islower()) # True print(str3.islower()) # False print(str4.islower()) # True声明:本文为个人学习笔记(有自己的理解和思考),旨在与大家交流学习。笔记内容整理自B站UP主「哔哩 Python 学习社」的视频教程《如何逼自己一周学会〈Python〉》,非本人原创。如有内容错误,欢迎各位指正讨论。尊重原创,感谢UP主的分享。