格式化字符串

Python
作者

yangjh

发布日期

2022-11-23 00:04

Python 中的字符串(Strings)是用单引号或双引号标记的一系列连续字符(characters),换句话说,字符串是由单个字符组成的序列(list)。即便只有一个字符,也是字符串,Python 中没有字符数据类型。单引号括起的字符串和双引号括起的字符串是一样的,它们不存在任何区别

还可以使用三引号'''定义字符串,这种方式可以定义多行文字。

创建字符串

创建字符串的最简单方法是将文本放入单引号(')或双引号(")中。Python不区分单引号和双引号,你可以根据自己的喜好选择使用。

# 使用单引号
greeting = 'Hello, World!'

# 使用双引号
greeting = "Hello, World!"

在这两个例子中,greeting 是一个字符串变量,它包含了文本 “Hello, World!”。

多行字符串

如果你想创建包含多行的字符串,可以使用三个单引号(''')或三个双引号(""")。

# 使用三个单引号
long_string = '''
Hello,
World!
This is a multi-line string.
'''

# 使用三个双引号
long_string = """
Hello,
World!
This is a multi-line string.
"""

在这里,long_string 包含了一个跨越多行的字符串。

字符串的不可变性

在 Python 中,每一个对象都可以分为不可变性或者可变性。在核心类型中,数字、字符串和元组是不可变的

字符串在 Python 中一旦创建就不能就地改变,例如不能对其某一位置进行赋值而改变字符串。下面的语句就会出现如下语法错误:“TypeError: 'str' object does not support item assignment”。

s = 'string'
print(len(s))
print(s[0])                 # 输出序列的第一个元素
s[0] = 'another s'          # 试图修改字符串的内容
print(s)

关于不可变性,我们再看一个例子:

>>> str1 = "welcome"
>>> str2 = "welcome"

上述代码中,str1str2 都指向存储在内存中某个地方的字符串对象"welcome"。我们可以通过id() 函数来测试 str1str2 是否真的指向同一个对象。

id() 函数可以得到对象在内存中的存储地址。

如下:

>>> str1 = 'welcome'
>>> str2 = 'welcome'
>>> id(str1)
35462112
>>> id(str2)
35462112

我们可以看到,str1str2 都指向同一个内存地址,因此,他们都指向同样的对象“welcome”。下面让我们再编辑 str1 的内容看看:

>>> str1 += " yangjh"
>>> str1
'welcome yangjh'
>>> id(str1)
35487600

我们可以看到,现在变量 str1 指向了一个完全不同的内容地址,这也说明,我们对 str1 的内容操作实际上是新建了一个新的字符串对象。

字符串切片

我们还可以通过“[]”操作符来获取原始字符串的子集,这就是所谓的切片。语法规则如下:

s[start:end]

切分操作将返回字符串的部分内容,起始于 index,结束于 end-1。例如:

>>> s = 'yangjh'
>>> s[1:3]
'an'
>>> s = "Welcome"
>>> s[ : 6]
'Welcom'
>>> s[4 : ]
'ome'
>>> s[1 : -1]
'elcom'

注意:开始索引和结束索引都是可选的,如果忽略,开始索引就是 0,而结束索引就是字符串的最后一个字符对应的索引值。

字符串对象常用方法

下表是常用的字符串方法:

方法名称 功能描述
len() 返回字符串长度
max() 返回字符串中 ASCII 编码值最大的字符
min() 返回字符串中 ASCII 编码值最小的字符
title() 以首字母大写的方式显示每个单词。
upper() 将字符串改为全部大写
lower() 将字符串全部改为小写
>>> len("hello")
5
>>> max("abc")
'c'
>>> min("abc")
'a'

比较字符串

我们可以使用 ( > , < , <= , <= , == , != ) 比较两个字符串。Python 比较字符串是按照编纂字典的方式进行的,也就是使用 ASCII 编码值

假设 str1的值为"Jane"str2 的值为"Jake",首先比较这两个字符串的第一个字符“J”,如果相等,就继续比较第二个字符(a 和 a),因为相同,所以继续比较第三个字符(n 和 k),因为 n 的 ASCII 编码值大于 k,因此 str1 大于 str2。更多例子参见下面的代码:

>>> "tim" == "tie"
False
>>> "free" != "freedom"
True
>>> "arrow" > "aron"
True
>>> "green" >= "glow"
True
>>> "green" < "glow"
False
>>> "green" <= "glow"
False
>>> "ab" <= "abc"
True

遍历字符串

字符串是序列,因此也可以使用循环遍历成员。

>>> s = "yangjh"
>>> for i in s:
...     print(i, end="")
...
yangjh

print()函数在默认状态下,会另起一行打印字符串,我们可以使用第二个参数修改结束标记。如print("my string", end="")就表示打印字符串,但不另起一行。

字符串内容检验

Python 字符串类内置了丰富的方法,使用这些方法,我们可以检查字符串内容的类型。

方法名称 方法说明
isalnum() 如果 str 包含字符都是字母或数字则返回 True
isalpha() 如果 string 包含字符都是字母则返回 True
isdigit() 如果 string 包含字符都是数字则返回 True
isidentifier() 判断字符串是否是合格的标识名
islower() 判断字符串中是否都是小写字母
isupper() 判断字符串中是否都是大写字母
isspace() 判断字符串是否由空格组成

这些判断方法的实例如下:

>>> s = "welcome to python"
>>> s.isalnum()
False
>>> "Welcome".isalpha()
True
>>> "2012".isdigit()
True
>>> "first Number".isidentifier()
False
>>> s.islower()
True
>>> "WELCOME".isupper()
True
>>> "  \t".isspace()
True

字符串内查找和替换

除了一般的序列操作,字符串还有独有的一些方法。如查找和替换:

print(s.find('in'))
print(s.replace('g', 'gs'))  # 虽然显示字符串已被替换,但实际上是一个新的字符串。

相关的方法见下表:

方法名称 方法说明
endswith(s1: str): bool 如果字符串以指定的字符串结尾,则返回真
startswith(s1: str): bool 如果字符串以指定的字符串开始,则返回真
count(substring): int 返回子字符串在字符串中出现的次数
find(s1): int 返回子字符串在字符串中第一次出现的索引,如果没有,则返回-1
rfind(s1): int 返回子字符串在字符串中最后一次出现的索引,如果没有,则返回-1

示例如下:

>>> s = "welcome to python"
>>> s.endswith("thon")
True
>>> s.startswith("good")
False
>>> s.find("come")
3
>>> s.find("become")
-1
>>> s.rfind("o")
15
>>> s.count("o")
3

接受用户输入的内容字符串

input()函数可以接受用户输入的内容,并将其保存到字符串中:

price = input("请输入您的年龄\n")
print(type(price), price)

该函数返回的值是字符串类型。

格式化字符串

字符串模版

  • 在字符串前加前缀 fF,通过 {expression} 表达式,可以在字符串中使用表达式的值。
  • 还可在表达式后面增加格式说明符,以便控制内容格式。

Python格式化字符串的替代符以及含义

符号 说明
%c 格式化字符及其ASCII码
%s 格式化字符串
%d 格式化整数
%u 格式化无符号整型
%o 格式化无符号八进制数
%x 格式化无符号十六进制数
%X 格式化无符号十六进制数(大写)
%f 格式化浮点数字,可指定小数点后的精度
%e 用科学计数法格式化浮点数
%E 作用同%e,用科学计数法格式化浮点数
%g 根据值的大小决定使用%f或%e
%G 作用同%g,根据值的大小决定使用%f%e
%p 用十六进制数格式化变量的地址

案例: 设置浮点数的显示精度

import math
print(f'{math.pi:.3f}.')

print(f'{math.pi:.3f}.')将打印出3.141。在 ':' 后传递整数,为该字段设置最小字符宽度,常用于列对齐。

案例:设置字符换及数字显示长度

table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
for name, phone in table.items():
    print(f'{name:10} ==> {phone:10d}')
...
Sjoerd     ==>       4127
Jack       ==>       4098
Dcab       ==>       7678

f字符串是Python 3.6引入的。如果你使用的是Python 3.5或更早的版本,需要使用format()方法,而非这种f语法。要使用方法format(),可在圆括号内列出要在字符串中使用的变量。对于每个变量,都通过一对花括号来引用。

还可以使用字符串format()方法。str.format() 方法的基本用法如下所示:

for x in range(1, 11):
...     print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))
...
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125
 6  36  216
 7  49  343
 8  64  512
 9  81  729
10 100 1000
print('We are the {} who say "{}!"'.format('knights', 'Ni'))
We are the knights who say "Ni!"

花括号及之内的字符(称为格式字段)被替换为传递给 str.format() 方法的对象。花括号中的数字表示传递给 str.format() 方法的对象所在的位置。

 print('{0} and {1}'.format('spam', 'eggs'))
spam and eggs
 print('{1} and {0}'.format('spam', 'eggs'))
eggs and spam

str.format() 方法中使用关键字参数名引用值。

print('This {food} is {adjective}.'.format(
...       food='spam', adjective='absolutely horrible'))
This spam is absolutely horrible.

字符转义

使用\加上符号表示对其后的字符进行转义,如\n表示换行,而不是\n的简单组合。例如,要在字符串中添加制表符,可使用字符组合\t

常用转义符号

符号 说明
\ 如果出现在行尾,则表示续行。即一行未完,转到下一行继续写
\' 单引号
\" 双引号
\n 换行符
\t 横向制表符
\r 回车符
\x 十六进制数代表的字符

原始字符串

要防止字符串中使用转义,需要在字符串前面加上r或者R,表示原始(raw)字符串,例如r"data\600519.csv"

防止字符转义案例

fileUrl = r"data\600519.csv"

如果不加r,则文件路径中的\600就会被转义为ƀ,进而可能会引发错误。

参考文献

  1. https://docs.python.org/zh-cn/3/tutorial/inputoutput.html#the-string-format-method
回到顶部