String (字符串)
Python str 是 不可变对象(immutable),基于 Unicode。
修改字符串会产生新对象。
天然支持中文、Emoji 等。
支持切片、索引、len、in。
s = "hello"
s = 'hello'
s = """多行
字符串"""
s = str(123)
长度
len(s)
索引/切片
s[0]
s[-1]
s[1:5]
s[::-1] # 反转
拼接
a + b
" ".join(list_of_words)
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 # 布尔判断
s.upper() # 将字符串 s 中的所有字母转换为大写
s.lower() # 将字符串 s 中的所有字母转换为小写
s.title() # 将字符串 s 中每个单词的首字母转换为大写
s.capitalize() # 将字符串 s 的第一个字母转换为大写
s.swapcase() # 交换字符串 s 中所有字母的大小写,大写变小写,小写变大写
s.strip() # 移除字符串 s 首尾的空白字符。(如果不指定参数,默认移除所有的空白字符(包括空格、换行符、制表符等))
s.lstrip() # 移除字符串 s 左侧(开头)的空白字符。(不指定参数时默认移除所有空白字符)
s.rstrip() # 移除字符串 s 右侧(结尾)的空白字符。(不指定参数时默认移除所有空白字符)
s.strip("xyz") # 移除字符串 s 首尾的 指定字符串 "xyz" 字符。
替换
s.replace("old", "new")
分割
s.split(",") # 返回 list
s.splitlines() # 按行分割
合并
",".join(["a", "b", "c"])
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)
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 标识符(是否合法的变量名)
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)
❌ 不要这样做(慢)
s = ""
for i in range(10000):
s += str(i)
✅ 推荐使用 join()
"".join(str(i) for i in range(10000))
join() 基于一次性分配内存,效率远高于重复创建对象。
保留换行
content = """line1
line2
line3"""
删除缩进
import textwrap
textwrap.dedent("""
hello
world
""")
如果你想“正则替换”,要用 re.sub。
如果要保留:
re.split(r"(,)", "a,b,c")
修改操作不会原地改变字符串。
s.encode("utf-8")
b.decode("utf-8")
常用编码:UTF-8、GBK、ASCII。
from string import Template
t = Template("Hello $name")
t.substitute(name="martin")
reversed_s = s[::-1]
from collections import Counter
Counter(s)
s == s[::-1]
''.join(filter(str.isdigit, s))
- 使用 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