Python 字符串

作者:billy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

字符串编码转换

说起字符串,不得不提的就是字符编码,让我们先简单回顾一下字符串编码的发展史。

  • 最早的字符串编码,是美国的标准信息交换码,即 ASCII 码。它仅对 10 个数字、26 个大写英文字母、26 个小写英文字母,以及一些其他符号进行了编码。ASCII 码最多只能表示 256 个字符,每个字符占一个字节。
  • 随着信息技术的发展,各国的文字都需要进行编码,于是出现了 GBK、GB2313、UTF-8 等编码。其中 GBK 和 GB2313 是我国制定的中文编码标准,使用一个字节表示英文字母,2 个字节表示中文字符。
  • 而 UTF-8 是国际通用的编码,对全世界所有国家需要用到的字符都进行了编码。UTF-8 采用一个字节表示英文字符,3 个字节表示中文。在 Python 3.x 中,默认采用的编码格式是 UTF-8,采用这种编码有效的解决了中文乱码的问题。
  1. 使用 encode() 方法编码
    encode() 方法为 str 对象的方法,用于将字符串转换为二进制数据(即 bytes),也称为 “编码”,其语法格式如下:
    str.encode([encoding="utf-8"][,errors="strict"])
    str:表示要进行转换的字符串;
    encoding=“utf-8”:可选参数,用于指定进行转码时采用的字符编码,默认为 UTF-8。如果想使用简体中文,也可以设置为 GB2313。当只有这一个参数时,也可以省略前面的 “encoding=”,直接写编码;
    error=“strict”:可选参数,用于指定错误处理方式。可以选择的值有:strict(遇到非法字符就抛出异常)、ignore(忽略非法字符)、replace(用 “?” 替换非法字符)或 xmlcharrefreplace(使用XML的字符引用)等,默认是 strict;

示例:

verse = "野渡无人舟自横"
byte1 = verse.encode("GBK")
byte2 = verse.encode("UTF-8")
print("原字符串为:", verse)
print("转换 GBK 后:", byte1)
print("转换 UTF-8 后:", byte2)

上述例子的运行结果为:

原字符串为: 野渡无人舟自横
转换 GBK 后: b'\xd2\xb0\xb6\xc9\xce\xde\xc8\xcb\xd6\xdb\xd7\xd4\xba\xe1'
转换 UTF-8 后: b'\xe9\x87\x8e\xe6\xb8\xa1\xe6\x97\xa0\xe4\xba\xba\xe8\x88\x9f\xe8\x87\xaa\xe6\xa8\xaa'

bytes 类型的数据是带有 b 前缀的字符串(用单引号或双引号表示)

  1. 使用 decode() 方法解码
    decode() 方法为 bytes 对象的方法,用于将二进制数据转换为字符串,即把使用 encode() 方法转换的结果再转换为字符串,也称为 “解码”,其语法格式如下:
    bytes.decode([encoding="utf-8"][,errors=""strict])

示例:

byte = b'\xd2\xb0\xb6\xc9\xce\xde\xc8\xcb\xd6\xdb\xd7\xd4\xba\xe1'
verse = byte.decode("GBK")
print("解码后:", verse)

上述例子的运行结果为:解码后: 野渡无人舟自横

字符串常规操作

  1. 拼接字符串
    使用 ‘+’ 运算符对多个字符串进行拼接,产生一个字符串对象。字符串不允许直接与其他类型的数据拼接,需要先使用 str() 函数转换为字符串。

示例:

str1 = "我今天一共走了 "
num = 12500
str2 = " 步"
print(str1 + str(num) + str2)

上述例子的运行结果为:我今天一共走了 12500 步

  1. 计算字符串长度
    Python 中提供了 len() 函数获取字符串的长度。

示例:

str = "人生苦短,我用 Python"
length1 = len(str)
length2 = len(str.encode("UTF-8"))
print("字符串长度为:", length1)
print("UTF-8 编码的字符串长度为:", length2)

上述例子的运行结果为:

字符串长度为: 14
UTF-8 编码的字符串长度为: 28

使用 len() 函数计算长度时,不区分英文、数字和汉字,所有字符都认为是一个长度。如果需要获取实际的字符串长度,需要使用 encode() 编码后再获取

  1. 截取字符串
    由于字符串也属于序列,所以要截取字符串,可以采用切片的方法来实现。

示例:

str = "人生苦短,我用 Python"  # 定义字符串
substr1 = str[1]            # 截取第 2 个字符
substr2 = str[5:]           # 从第 6 个字符开始截取
substr3 = str[:5]           # 从左边开始截取 5 个字符
substr4 = str[2:8]          # 截取第 3 个到第 8 个字符
print(substr1)
print(substr2)
print(substr3)
print(substr4)

上述例子的运行结果为:

生
我用 Python
人生苦短,
苦短,我用 

在截取字符串时,如果指定索引不存在,则会抛出异常。可以使用 try…except 语句捕获异常

  1. 分割、合并字符串
    字符串对象的 split() 方法可是实现字符串的分割。即把一个字符串按照指定的分隔符切分为字符串列表。该列表的元素中,不包括分隔符,语法格式如下:
    str.split(sep, maxsplit)
    str:表示要进行分割的字符串;
    sep:用于指定分隔符,可以包含多个字符串,默认为 None,即所有空字符(包括空格、换行 “\n”、制表符 “\t” 等);
    maxsplit:可选参数,用于指定分割的次数,如果不指定或者为 -1,则分割次数没有限制,否则返回结果列表的元素个数最多为 maxsplit + 1;
    返回值:分割后的字符串列表;

示例:

str = "我 要 上 百 度 >>> www.baidu.com 看 电 影 !"  # 定义字符串
list1 = str.split()
list2 = str.split('>')
list3 = str.split('.')
list4 = str.split(' ', 4)
list5 = str.split('<')
print(str)
print(list1)
print(list2)
print(list3)
print(list4)
print(list5)

上述例子的运行结果为:

我 要 上 百 度 >>> www.baidu.com 看 电 影 !
['我', '要', '上', '百', '度', '>>>', 'www.baidu.com', '看', '电', '影', '!']
['我 要 上 百 度 ', '', '', ' www.baidu.com 看 电 影 !']
['我 要 上 百 度 >>> www', 'baidu', 'com 看 电 影 !']
['我', '要', '上', '百', '度 >>> www.baidu.com 看 电 影 !']
['我 要 上 百 度 >>> www.baidu.com 看 电 影 !']

注意:在 split() 方法中,如果不指定 sep 参数,那么也不能指定 maxsplit 参数

合并字符串与拼接字符串不同,它会将多个字符串采用固定的分隔符连接在一起。合并字符串可以使用字符串对象的 join() 方法实现,其语法格式如下:
strnew = string.join(iterable)
strnew:表示合并后生成的新字符串;
string:字符串类型,用于指定合并时的分隔符;
iterable:可迭代对象。该迭代对象中所有的元素(字符串表示)将被合并为一个新的字符串,string 作为边界点分割出来;

示例:

list = ["马云", "马化腾", "马三立", "马克思", "马屁精"]
str = ' @'.join(list)
print("您要@的好友:" + '@' + str)

上述例子的运行结果为:您要@的好友:@马云 @马化腾 @马三立 @马克思 @马屁精

  1. 检索字符串
    Python 中提供的一些检索字符串的方法
函数功能说明
count()用于检索指定字符串在另一个字符串中出现的次数,不存在返回 0
find()用于检索是否包含指定的子字符串,不存在返回 -1
index()也是用于检索是否包含子字符串,不存在是抛出异常
startswith()用于检索字符串是否以指定字符串开头,是返回 True,否则返回 False
endswith()用于检索字符串是否以指定字符串结尾,是返回 True,否则返回 False

示例:

str = "马云改变了我的购物方式,马化腾改变了我的交流方式,马三立提高了我的幽默感," \
      "马蓉颠覆了我三观,马屁精永远是照亮仕途的一盏明灯,马赛克阻挡了我对人类文明的探索,总之姓马的都很厉害!"
test_count = str.count("马")
test_find = str.find("幽默感")
test_index = str.index("马化腾")
test_startswith = str.startswith("马")
test_endswith = str.endswith("马")
print(test_count)
print(test_find)
print(test_index)
print(test_startswith)
print(test_endswith)

上述例子的运行结果为:

7
33
12
True
False
  1. 字母的大小写转换
    字符串对象的 lower() 方法用于将字符串中的全部大写字母转换为小写字母。而 upper() 方法用于将字符串中的全部小写字母转换为大写字母。

示例:

str = "Python - The Great Devil"
test_lower = str.lower()
print(str)
print(test_lower)

test_upper = str.upper()
print(str)
print(test_upper)

上述例子的运行结果为:

Python - The Great Devil
python - the great devil
Python - The Great Devil
PYTHON - THE GREAT DEVIL

根据上述结果我们可以得知:lower() 和 upper() 不会改变原字符串

  1. 去除字符串中的空格和特殊字符
    用户在输入的时候,可能会无意中输入多余的空格,或在一些情况下,字符串前后不允许出现空格和特殊字符,此时就需要去除字符串中的空格和特殊字符。
    这里的特殊字符是指制表符 \t、回车符 \r、换行符 \n 等
函数功能说明
strip()用于去除字符串左右两侧的空格和特殊字符
lstrip()用于去除字符串左侧的空格和特殊字符
rstrip()用于去除字符串右边的空格和特殊字符

示例:

str = "   人生苦短,我用 Python  \t\n\r"
test_strip = str.strip()
test_lstrip = str.lstrip()
test_rstrip = str.rstrip()
print(str)
print(test_strip)
print(test_lstrip)
print(test_rstrip)

上述例子的运行结果为:

   人生苦短,我用 Python   

人生苦短,我用 Python
人生苦短,我用 Python 

   人生苦短,我用 Python
  1. 格式化字符串
    格式化字符串的意思是先制定一个模板,在这个模板中预留几个空位,然后再根据需要填上相应的内容。这些空位需要通过指定的符号标记(也称为占位符),而这些符号不会显示出来。

可以使用 “%” 操作符实现格式化字符串,语法格式如下:
'%[-][+][0][m][.n]格式化字符'%exp
-:可选参数,用于指定左对齐,正数前面无符号,负数前面加负号;
+:可选参数,用于指定右对齐,正数前面加正号,负数前面加负号;
0:可选参数,表示右对齐,正数前面无符号,负数前面加负号,用 0 填充空白处(一般与 m 参数一起使用)
m:可选参数,表示占有宽度;
.n:可选参数,表示小数点后保留的位数;
格式化字符:用于指定类型,其值如下表:

格式字符说明格式字符说明
%s字符串(采用 str() 显示)%r字符串(采用 repr() 显示)
%c单个字符%o八进制整数
%d 或者 %i十进制整数%e指数(基底写为 e)
%x十六进制整数%E指数(基底写为 E)
%f 或者%F浮点数%%字符%

exp:要转换的项。如果要指定的项有多个,需要通过元组的形式进行指定,不能使用列表;

示例:

template = "编号: %09d\t 公司名称: %s\t 官网: http://www.%s.com"
context1 = (7, "百度", "baidu")
context2 = (8, "谷歌", "google")
print(template % context1)
print(template % context2)

上述例子的运行结果为:

编号: 000000007  公司名称: 百度  官网: http://www.baidu.com
编号: 000000008  公司名称: 谷歌  官网: http://www.google.com

“%” 操作符是早期 Python 中提供的方法,自从 Python 2.6 版本开始,字符串对象提供了 format() 方法对字符串进行格式化,其语法格式如下:
str.format(args)

下面重点介绍如何创建模板,在创建模板时,需要使用 “{}” 和 “:” 指定占位符,语法如下:
{[index][ :[[fill]align][sign][#][width][.precision][type] ]}
index:可选参数,用于指定要设置格式的对象在参数列表中的索引位置,索引值从 0 开始。如果省略,则根据值得先后顺序自动分配;
fill:可选参数,用于指定空白处填充的字符;
align:可选参数,用于指定对齐方式(值为 ‘<’ 表示内容左对齐、值为 ‘>’ 表示内容右对齐、值为 ‘=’ 表示内容右对齐,将符号放在填充内容的最左侧,且只对数字类型有效、值为 ‘^’ 表示内容居中),需要配合 width 一起使用;
sign:可选参数,用于指定有无符号数(值为 ‘+’ 表示正数加正号,负数加负号、值为 ‘-’ 表示正数不变,负数加负号、值为空格表示正数加空格,负数加负号);
#:可选参数,对于二进制、八进制和十六进制,如果加上 ‘#’,表示会显示 0b/0o/0x 前缀,否则不显示前缀;
width:可选参数,用于指定所占宽度;
.precision:可选参数,用于指定保留的小数位数;
type:可选参数,用于指定类型,其值如下表:

格式符号说明格式符号说明
S对字符串类型格式化b将十进制整数自动转换为二进制表示再格式化
D十进制整数o将十进制整数自动转换为八进制表示再格式化
C将十进制整数自动转换成对应的 Unicode 字符x 或者 X将十进制整数自动转换为十六进制表示再格式化
e 或者 E转换为科学计数法表示再格式化f 或者 F转换为浮点数(默认小数点后保留 6 位)再格式化
g 或者 G自动在 e 和 f 或者 E 和 F 中切换%显示百分比(默认显示小数点后 6 位)

示例:

template = '编号: {:0>9s}\t 公司名称: {:s}\t 官网: http://www.{:s}.com'
context1 = template.format('7', "百度", "baidu")
context2 = template.format('8', "谷歌", "google")
print(context1)
print(context2)

上述例子的运行结果为:

编号: 000000007  公司名称: 百度  官网: http://www.baidu.com
编号: 000000008  公司名称: 谷歌  官网: http://www.google.com

在实际开发中,数值类型有多种显示方式,比如货币形式、百分比形式等,使用 format() 方法可以将数值格式化为不同的形式

示例:

import math
print('1251 + 3950 的结果是(以货币形式显示):¥{:,.2f}元'.format(1251 + 3950))
print('{0:.1f} 用科学计数法表示是:{0:E}'.format(120000.1))
print('π 取 8 位小数点:{:.8f}'.format(math.pi))
print('{0:d} 的 16 进制结果是:{0:#x}'.format(100))
print('天才是由 {:.0%} 的灵感,加上 {:.0%} 的汗水'.format(0.01, 0.99))

上述例子的运行结果为:

1251 + 3950 的结果是(以货币形式显示):¥5,201.00元
120000.1 用科学计数法表示是:1.200001E+05
π 取 8 位小数点:3.14159265
100 的 16 进制结果是:0x64
天才是由 1% 的灵感,加上 99% 的汗水

更多请参考

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值