1. 文本
字符串是由一串字符组成的文本数据。用户名、提示词、文件路径、接口地址和模型回复,通常都会以字符串的形式出现。
Python 可以使用单引号或双引号创建字符串:
1name = '小明'2message = "欢迎学习 Python"34print(name)5print(message)
单引号和双引号没有本质区别,选择一种并在项目中保持一致即可。如果字符串本身包含某种引号,可以使用另一种引号包裹:
1title = "这是一段包含 '单引号' 的文本"2sentence = '他说:"你好"'34print(title)5print(sentence)
如果文本中同时包含单引号和双引号,或者需要保留多行格式,可以使用三引号:
1description = """这是第一行。2这是第二行。3这是第三行。"""45print(description)
反斜杠可以表示特殊字符。常见的转义字符包括 \n 换行、\t 制表符和 \\ 反斜杠本身:
1text = "第一行\n第二行\t缩进文本"23print(text)
如果 Windows 路径或正则表达式中有很多反斜杠,可以使用原始字符串,在字符串前加 r:
1path = r"C:\Users\xiaoming\notes"23print(path)
2. 索引
字符串中的每个字符都有位置。Python 从 0 开始计算位置,第一个字符的索引是 0:
1word = "Python"23print(word[0]) # P4print(word[1]) # y5print(word[5]) # n
也可以使用负数索引从字符串末尾开始查找,-1 表示最后一个字符:
1word = "Python"23print(word[-1]) # n4print(word[-2]) # o
切片用于截取一段字符串,基本形式是 text[start:stop]。开始位置包含在结果中,结束位置不包含:
1word = "Python"23print(word[0:2]) # Py4print(word[2:]) # thon5print(word[:4]) # Pyth6print(word[:]) # Python
切片还可以指定步长 text[start:stop:step]:
1word = "Python"23print(word[::2]) # Pto4print(word[::-1]) # nohtyP
索引超出范围会抛出 IndexError,所以读取不确定长度的文本时要先判断长度,或者使用切片:
1text = "Hi"23if len(text) > 5:4print(text[5])56print(text[:6]) # Hi,切片不会因为结束位置过大而报错
字符串是不可变对象。不能直接修改其中的某个字符,应该根据原字符串创建一个新字符串:
1word = "Python"23# word[0] = "J" # TypeError4word = "J" + word[1:]56print(word) # Jython
3. 方法
字符串提供了许多常用方法,用于清理、查找和替换文本。字符串方法不会修改原字符串,而是返回处理后的新字符串。
| 方法 | 用途 | 示例 |
|---|---|---|
lower() | 转换为小写 | text.lower() |
upper() | 转换为大写 | text.upper() |
strip() | 删除两端空白 | text.strip() |
replace() | 替换文本 | text.replace("旧", "新") |
startswith() | 判断开头 | text.startswith("前缀") |
endswith() | 判断结尾 | text.endswith(".py") |
find() | 查找位置 | text.find("Python") |
count() | 统计出现次数 | text.count("a") |
下面是几个最常见的清理和转换方法:
1text = " Hello, Python! "23print(text.lower()) # hello, python!4print(text.upper()) # HELLO, PYTHON!5print(text.strip()) # Hello, Python!6print(text.replace("Python", "AI")) # Hello, AI!
strip() 默认删除字符串两端的空白,也可以指定要删除的字符。它不会删除中间的空格:
1text = "---Python---"23print(text.strip("-")) # Python
查找和判断方法经常用于输入校验:
1email = "user@example.com"23print("@" in email) # True4print(email.startswith("user")) # True5print(email.endswith(".com")) # True6print(email.find("@")) # 47print(email.find("#")) # -1
find() 找不到内容时返回 -1。如果只需要判断是否包含某段文本,使用 in 通常更容易读懂:
1question = "如何使用 LangChain?"23if "LangChain" in question:4print("这是一个 LangChain 相关问题")
4. 拆分
split() 可以按照分隔符把一个字符串拆成列表。默认按照空白字符拆分:
1sentence = "Python 适合构建 AI 应用"2words = sentence.split()34print(words)
也可以指定逗号、换行等分隔符:
1value = "Python,FastAPI,LangChain"2items = value.split(",")34print(items) # ['Python', 'FastAPI', 'LangChain']
拆分后常常需要清理每一项的空格:
1value = "Python, FastAPI, LangChain"2items = [item.strip() for item in value.split(",")]34print(items)
join() 与 split() 相反,它使用一个字符串把多个字符串连接起来。调用 join() 的对象是分隔符,而不是列表:
1items = ["Python", "FastAPI", "LangChain"]23text = " / ".join(items)4print(text) # Python / FastAPI / LangChain
join() 要求列表中的每个元素都是字符串。列表里有数字时,需要先转换类型:
1numbers = [1, 2, 3]2text = ", ".join(str(number) for number in numbers)34print(text) # 1, 2, 3
5. 格式
字符串拼接可以使用 +,但当文本中包含多个变量时,f-string 通常更清晰。只需要在字符串前加 f,再把变量写入 {}:
1name = "小明"2age = 1834message = f"{name} 今年 {age} 岁"5print(message)
大括号中也可以放表达式:
1price = 39.92quantity = 234print(f"合计:{price * quantity} 元")
金额、百分比和统计结果经常需要控制显示格式。:.2f 表示保留两位小数:
1price = 39.92rate = 0.8534print(f"价格:{price:.2f} 元")5print(f"折扣:{rate:.0%}")
f-string 也可以调用方法,但表达式太复杂时,应该先保存到变量,再放进字符串:
1name = " 小明 "2clean_name = name.strip()34print(f"用户:{clean_name}")
6. 转换
input() 返回的内容总是字符串,即使用户输入的是数字。需要进行计算或比较时,应当先显式转换:
1age_text = input("请输入年龄:")2age = int(age_text)34if age >= 18:5print("已成年")
常见的类型转换方法包括 str()、int() 和 float():
1number = 182price_text = "39.9"34message = str(number)5price = float(price_text)6count = int("3")78print(message)9print(price * count)
转换可能失败。例如,int("十八") 无法得到整数,会抛出 ValueError。处理用户输入或外部接口数据时,应使用异常处理或 Pydantic 校验:
1value = "十八"23try:4age = int(value)5except ValueError:6age = None78print(age)
字符串还经常用于比较和查找,但大小写可能导致看似相同的内容比较失败。需要忽略大小写时,可以先统一转换:
1keyword = "Python"2query = "python 教程"34if keyword.lower() in query.lower():5print("找到了关键词")