Python字符串格式化教程:format、f-string、对齐精度与常用字符串方法详解

·8 阅读编程基础Python
Python字符串格式化教程:format、f-string、对齐精度与常用字符串方法详解

4.1 设置字符串格式

设置字符串格式的方法有很多,这里主要介绍通过调用format并传入需要设置的值来设置格式的信息,其中需要被替换的值用花括号包裹起来,如果需要在字符串中显示花括号,需要使用两个相同的花括号。

下面内容主要以format()为主,但我们也可以在字符串时前使用f标识符,效果一致如下的两个语句效果是一样的

name = "泠曦"
age = "18"
print(f"name:{name:^10},age:{age:^10}")
name = "泠曦"
age = "18"
print("name:{name:^10},age:{age:^10}".format(name=name, age=age))

输出都是

name:    泠曦    ,age:    18  

4.1.1 替换字段名

第一种方法则为在花括号内指明参数名称,在format中给对应参数赋值:

print("{name},{age}".format(name="泠曦", age=18))
泠曦,18

第二种为不设置参数名,只在后面写上参数值,将会按照顺序填充:

print("{},{}".format("你好", "World"))
你好,World

第三种为设置索引,将会在后面括号中按照索引顺序获得对应值:

print("{1},{0}".format("字符串", "格式设置"))
格式设置,字符串

但是需要注意,手动设置索引和不设置索引自动引入不可以同时使用,否则将会出现错误:

print("{1},{}".format("字符串", "格式设置"))
    print("{1},{}".format("字符串", "格式设置"))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: cannot switch from manual field specification to automatic field numbering

我们还可以使用.来访问导入模块的函数、属性、变量:

import math

s = "从{mod.__name__}中获取圆周率:{mod.pi}"
print(s.format(mod=math))
从math中获取圆周率:3.141592653589793

4.1.2 基本转换

在指定字段中包含的值后,我们可以在后面添加如何设置其格式的指令:

print("{emoji!s}{emoji!r}{emoji!a}".format(emoji="😀"))
😀'😀''\U0001f600

上面分别将😀指定为str(s)、repr(r)、ascii(a)格式进行转换。

除此之外,我们还可以指定将值转换为哪种类型,如小数、二进制码等等。只需要将!改为:,然后写上对应的类型说明符即可。

如我们将63用十进制、二进制、八进制、十六进制展示出来:

print("十进制:{num:d}\t二进制:{num:b}\t八进制:{num:o}\t十六进制:{num:x}".format(num=63))
十进制:63	二进制:111111	八进制:77	十六进制:3f

字符串设置中的类型说明符见下表

类型 含义
b 将整数表示为二进制数
c 将整数解读为Unicode码点
d 将整数视为十进制数处理,整数默认会使用的说明符
e 使用科学表示法来表示小数(用e表示指数)
E 与e相同,但是使用E表示指数
f 将小数表示为定点数
F 与f相同,但对于特殊值(nan和inf),使用大写表示
g 自动在定点表示法和科学表示法之间做出选择。这是默认用于小数的说明符,但默认情况下至少有一位小数
G 与g相同,但是使用大写来表示指数和特殊值
n 与g相同,但插入随区域而异的数字分隔符
o 将整数表示为八进制数
s 保持字符串的格式不变,这是默认用于字符串的说明符
x 将整数表示为十六进制并使用小写字母
X 与x相同,但表示为大写字母
% 将数表示为百分比值(乘以100,按说明符f设置格式,最后加上%)

4.1.3 宽度、精度和千位分隔符

宽度

需要设置宽度时,我们可以直接在:后加上我们需要的宽度即可:

print("{num:8}".format(num=63))
print("{num:8f}".format(num=63))
      63
63.000000

精度

设置精度时,需要先写上小数点,然后在后面写上需要设置的精度:

print("{num:.2f}".format(num=63))
63.00

千位分隔符

需要使用千位分隔符要使用,:

print("{num:,}".format(num=10**10))
10,000,000,000

4.1.4 符号、对齐和填充

有些时候我们需要指定输出数据位置对齐,这里有三个符号可以表示对齐方式:<左对齐,>右对齐,^中对其,它的具体实现效果如下:

print("{0:<10.2f}\n{0:^10.2f}\n{0:>10.2f}".format(pi))
3.14      
   3.14   
      3.14

而如果需要设置填充,我们可以在设置宽度和精度的数前面,添加0、+、-或空格,其中0表示使用数字0填充,-为默认填充方式,+会在正数前加上正号:

print("{:010.2f}".format(pi))
print("{: 10.2f}{: 10.2f}".format(pi, -pi))
print("{:+10.2f}{:+10.2f}".format(pi, -pi))
print("{:-10.2f}{:-10.2f}".format(pi, -pi))
0000003.14
      3.14     -3.14
     +3.14     -3.14
      3.14     -3.14

我们还可以使用=,它会将填充放置于符号和数字之间:

print("{:=+010.2f}\n{:=+010.2f}".format(pi, -pi))
+000003.14
-000003.14

最后还有一种标识符#,将它放在符号说明符和宽度之间,他会触发另一种转换方式,转换细节随类型而异:

print("{:b}".format(63))
print("{:#b}".format(63))
print("{:g}".format(63))
print("{:#g}".format(63))
111111
0b111111
63
63.0000

4.2 字符串方法

关于字符串的方法有很多,这里只介绍比较常用的方法(其中方括号中的内容为可选内容):

方法 用处
center(宽度[,填充]) 将字符串居中,并将其左右填充指定字符(类似方法还有ljust、rjust)
find(需要查找的内容[,起点,终点]) 在字符串中从起点到终点查找对应内容,找到则返回第一次出现的索引,否则返回-1
join(序列) 与split相反,将序列合并为一个字符串(序列中的元素必须是字符串)
lower() 将字符串中所有字符转换为小写并返回
replace(指定子串,字符串) 将指定子串替换为字符串
split([分隔符,分割次数]) 将字符串根据分隔符位置分割为一个字符串列表(未指定分隔符则匹配空白字符)
strip([指定字符]) 删除字符串开头和结尾的指定字符(默认删除空格)
translate(转换表) 可以对字符串进行单字匹配替换,并删除指定的字符,但是使用前需要创建转换表,使用str.maketrans(目标字符,替换字符[,删除字符])创建

以下为各种方法的使用示例:

4.2.1 center(宽度[,填充])

s = "hello"
print(s.center(30))  # 使用空格填充居中
print(s.center(30, "*"))  # 使用*填充
            hello             
************hello*************

4.2.2 find(需要查找的内容[,起点,终点])

s = "hello world"
print(s.find("l"))  # 查找字符串中第一个匹配的位置
print(s.find("l", 3))  # 从第三个字符开始查找字符串中第一个匹配的位置
print(s.find("l", 4, 9))  # 从第三个字符开始,到第五个字符结束,查找字符串中第一个匹配的位置
2
3
-1

4.2.3 join(序列)

print("".join(["a", "b", "c"]))
abc

4.2.4 lower()

print("ABcdFgHiJk".lower())
abcdfghijk

4.2.5 replace(指定子串,字符串)

print("Hello World!".replace("l", "e"))
Heeeo Wored!

4.2.6 split([分隔符,分割次数])

s = "Hello python, hello world!"
print(s.split())  # 默认以空格为分隔符
print(s.split(","))  # 以逗号为分隔符
print(s.split(" ", 1))  # 以空格为分隔符,只分割一次
['Hello', 'python,', 'hello', 'world!']
['Hello python', ' hello world!']
['Hello', 'python, hello world!']

4.2.7 strip([指定字符])

s = "   ***  Hello World   ***   "
print(s.strip())  # 删除字符串头尾的空格
print(s.strip(" *"))  # 删除字符串头尾指定的空格和*
***  Hello World   ***
Hello World

4.2.8 translate(转换表)

s = "This is translate's test"
table = str.maketrans("is", "**")  # 创建字符映射的转换表,配合translate方法使用
print(s.translate(table))  # 将字符串中的i,s替换为*,*
Th** ** tran*late'* te*t

4.2.9 判断字符串是否满足某些特定条件

方法 解释
isalnum() 检查字符串是否由字母和数字组成,即字符串中的所有字符都是字母或数字。如果字符串至少有一个字符,并且所有字符都是字母或数字,则返回 True;否则返回 False。
isalpha() 如果字符串至少有一个字符并且所有字符都是字母或中文字则返回 True, 否则返回 False
isdigit() 如果字符串只包含数字则返回 True 否则返回 False
islower() 如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False
isnumeric() 如果字符串中只包含数字字符,则返回 True,否则返回 False
isspace() 如果字符串中只包含空白,则返回 True,否则返回 False.
istitle() 如果字符串是标题化的(见 title())则返回 True,否则返回 False
isupper() 如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False

相关建议