Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

String (字符串)

Python str 是 不可变对象(immutable),基于 Unicode。

1. 字符串基础特点

不可变

修改字符串会产生新对象。

Unicode 文本

天然支持中文、Emoji 等。

sequence 类型

支持切片、索引、len、in。

2. 常用创建方式

s = "hello"
s = 'hello'
s = """多行
字符串"""
s = str(123)

3. 基本操作

长度

len(s)

索引/切片

s[0]
s[-1]
s[1:5]
s[::-1]     # 反转

拼接

a + b
" ".join(list_of_words)

4. 查找与判断

s.startswith("abc")     # 判断字符串 s 是否以 prefix 开头

s.endswith("xyz")       # 判断字符串 s 是否以 suffix 结尾

s.find("hello")         # 查找子字符串 sub 在 s 中首次出现的索引。
                        # 如果找到,返回第一个匹配项的索引。
                        # 如果找不到,返回 -1

s.index("hello")        # 与 s.find(sub) 类似,查找子字符串 sub 在 s 中首次出现的索引。
                        # 如果找到,返回第一个匹配项的索引。
                        # 如果找不到,会抛出 ValueError 异常。

"abc" in s              # 布尔判断

5. 大小写转换

s.upper()       # 将字符串 s 中的所有字母转换为大写
s.lower()       # 将字符串 s 中的所有字母转换为小写
s.title()       # 将字符串 s 中每个单词的首字母转换为大写
s.capitalize()  # 将字符串 s 的第一个字母转换为大写
s.swapcase()    # 交换字符串 s 中所有字母的大小写,大写变小写,小写变大写

6. 去空白 / 修剪字符串

s.strip()       # 移除字符串 s 首尾的空白字符。(如果不指定参数,默认移除所有的空白字符(包括空格、换行符、制表符等))
s.lstrip()      # 移除字符串 s 左侧(开头)的空白字符。(不指定参数时默认移除所有空白字符)
s.rstrip()      # 移除字符串 s 右侧(结尾)的空白字符。(不指定参数时默认移除所有空白字符)
s.strip("xyz")  # 移除字符串 s 首尾的 指定字符串 "xyz" 字符。

7. 替换与分割

替换

s.replace("old", "new")

分割

s.split(",")             # 返回 list
s.splitlines()           # 按行分割

合并

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

8. 格式化字符串(超重要)

f-string(推荐)

name = "martin"
f"Hello {name}"

支持表达式:

f"{1+2}"
f"{value:.2f}"

format()

"Hello {}, {}".format("A", "B")
"{name} is {age}".format(name="Tom", age=20)

百分号格式(旧)

"%s %d" % ("hello", 10)

9. 字符串判断方法(Pythonic)

s.isdigit()         # 判断字符串 s 是否仅由数字组成
s.isalpha()         # 判断字符串 s 是否仅由字母组成
s.isalnum()         # 判断字符串 s 是否仅由字母或数字组成
s.isascii()         # 判断字符串 s 是否仅包含 ASCII 字符
s.islower()         # 判断字符串 s 中所有字母字符是否都是小写
s.isupper()         # 判断字符串 s 中所有字母字符是否都是大写
s.isspace()         # 判断字符串 s 是否仅由空白字符组成
s.isidentifier()    # 判断字符串 s 是否是一个有效的 Python 标识符(是否合法的变量名)

10. 正则表达式常用示例

import re

re.match(pattern, s)        # 从字符串的起始位置匹配一个模式。如果开头不匹配,则返回 None。
                            # 尝试从字符串 s 的开头匹配 pattern。

re.search(pattern, s)       # 在整个字符串中搜索模式。找到第一个匹配项后返回,否则返回 None。
                            # 在整个字符串 s 中搜索 pattern 的第一个匹配项。

re.findall(pattern, s)      # 找到所有匹配的子串,并以列表的形式返回所有匹配项。
                            # 查找并返回字符串 s 中所有与 pattern 匹配的子串列表。

re.sub(pattern, repl, s)    # 将字符串中所有匹配的子串替换为另一个字符串 repl。
                            # 用 repl 替换字符串 s 中所有与 pattern 匹配的子串。

示例

检查手机号

re.fullmatch(r"1\d{10}", phone)

提取数字

re.findall(r"\d+", text)

11. 字符串拼接性能(重点)

❌ 不要这样做(慢)

s = ""
for i in range(10000):
    s += str(i)

✅ 推荐使用 join()

"".join(str(i) for i in range(10000))

join() 基于一次性分配内存,效率远高于重复创建对象。

12. 多行字符串处理

保留换行

content = """line1
line2
line3"""

删除缩进

import textwrap

textwrap.dedent("""
    hello
        world
""")

13. 常见坑

❌ s.replace() 只能替换字面内容

如果你想“正则替换”,要用 re.sub。

❌ split() 默认不会保留分隔符

如果要保留:

re.split(r"(,)", "a,b,c")

❌ 字符串不可变

修改操作不会原地改变字符串。

14. 字符串编码(进阶)

s.encode("utf-8")
b.decode("utf-8")

常用编码:UTF-8、GBK、ASCII。

15. 高级用法

1) 字符串模板

from string import Template
t = Template("Hello $name")
t.substitute(name="martin")

2) 字符串翻转

reversed_s = s[::-1]

3) 字符频率统计

from collections import Counter
Counter(s)

4) 判断一个字符串是否是回文

s == s[::-1]

5) 提取数字 + join 美化

''.join(filter(str.isdigit, s))

16. string 最佳实践(精选)

  • 使用 f-string(格式化最清晰)
  • 大量字符串拼接用 join()
  • 处理用户输入时先 .strip()
  • 使用正则处理复杂匹配
  • 用 textwrap 处理多行文本
  • 遇到 ASCII 判断时用 .isascii()

字符串格式化

Python 的 str.format() 方法通过在字符串中使用 {} 作为占位符,并传入参数来格式化字符串。它可以通过位置参数、关键字参数或两者的组合来实现灵活的格式化,支持对齐、填充、指定小数位数、千位分隔符等多种格式控制。

基本用法

  • 位置参数: 按照参数的顺序替换占位符。
print("我叫{},来自{}。".format("小明", "北京"))
  • 关键字参数: 使用变量名作为占位符。
print("我叫{name},来自{city}。".format(name="小明", city="北京"))
  • 混合使用:
print("我叫{0},来自{city}。".format("小明", city="北京"))

格式说明符

可以在 {} 占位符中使用冒号 : 来指定格式说明符。

格式说明符 含义 示例
:< 左对齐 “{:<10}".format(“左对齐”)
:> 右对齐 “{:>10}".format(“右对齐”)
:^ 居中对齐 “{:^10}".format(“居中”)
:<10 左对齐,宽度为 10 “{:<10}".format(“左对齐”)
:<10s 左对齐,宽度为 10,字符串类型 “{:<10s}".format(“左对齐”)
:d 十进制整数 “{:d}".format(100)
:f 浮点数 “{:.2f}".format(3.14159) (保留两位小数)
:e 科学计数法(小写 e) “{:.2e}".format(1000000)
:b 二进制 “{:b}".format(10)
:o 八进制 “{:o}".format(10)
:x 十六进制(小写) “{:x}".format(255)
:+ 显示正负号 “{:+f}".format(10)
: 正数前加空格 “{: f}".format(10)
:, 千位分隔符 “{:,}".format(1000000)
{{ 输出一个 { 字符 “输出{{这里是大括号}}”
}} 输出一个 } 字符

示例

# 格式化浮点数
price = 123.4567
print("价格是 {:.2f} 元".format(price)) # 输出: 价格是 123.46 元

# 指定对齐和填充
text = "你好"
print("'{:->10}'".format(text)) # 输出: '你好------'

# 格式化日期(需要导入 datetime 模块)
import datetime
now = datetime.datetime.now()
print("日期:{:%Y-%m-%d %H:%M:%S}".format(now)) # 输出类似: 日期:2025-11-26 10:52:56