【python】基础数据类型之String-字符串

Python字符串核心技能学习大纲(含实例)

这份大纲从基础到进阶,最后落脚于实际工作场景,希望能帮你系统地掌握Python字符串,让它在日常工作中成为你的得力助手!

1. 基础入门:字符串是什么?

  • 定义与创建:单引号、双引号和三引号的区别与使用场景。
  • 基本操作
    • 索引与切片:精准获取你想要的字符。
    • 拼接与重复:+* 的妙用。
    • 长度计算:len() 的使用。

实例

python 复制代码
# 索引与切片:从版本号中提取主版本号
version = "v2.5.1"
major_version = version[1:2]  # 结果: '2'
# 拼接:动态构建API请求的URL
base_url = "https://api.example.com"
endpoint = "/users/123"
full_url = base_url + endpoint  # 结果: 'https://api.example.com/users/123'
# 长度:验证用户名是否符合长度要求
username = "test_user"
if 6 <= len(username) <= 20:
    print("用户名长度合规")

2. 核心方法:处理字符串的瑞士军刀

  • 查找与替换
    • find() / index():定位字符串位置。
    • replace():一键替换,轻松修改配置或日志内容。
  • 格式清理
    • strip() / lstrip() / rstrip():去除多余空格或换行符,处理读取的文件内容时特别好用。
  • 大小写转换
    • upper() / lower() / capitalize():统一格式,方便进行不区分大小写的比较。
  • 分割与连接
    • split():按指定分隔符切分字符串,是解析日志行和CSV数据的利器。
    • join():将列表合并为字符串,用于拼接路径或生成特定格式的报告。

实例

python 复制代码
# find(): 检查API响应中是否包含特定关键字
response_body = '{"status": "success", "message": "login successful"}'
if response_body.find("success") != -1:
    print("API调用成功")
# replace(): 脱敏处理日志中的密码
log_line = "User login attempt, password='my_secret'"
sanitized_log = log_line.replace("my_secret", "*****")
# 结果: "User login attempt, password='*****'"
# strip(): 清理从CSV文件读取的数据
raw_data = "  user_001  "
clean_data = raw_data.strip()  # 结果: 'user_001'
# split(): 解析日志行
log_entry = "2023-10-27 10:00:00, INFO, User logged in"
parts = log_entry.split(", ")
# parts -> ['2023-10-27 10:00:00', 'INFO', 'User logged in']
log_level = parts[1]  # 结果: 'INFO'
# join(): 构建文件路径
path_components = ["home", "user", "tests", "test_results.txt"]
full_path = "/".join(path_components)
# 结果: 'home/user/tests/test_results.txt'

3. 格式化进阶:让字符串更智能

  • f-string (格式化字符串字面值):现代、高效、可读性最强的格式化方式,强烈推荐掌握。
  • .format() 方法:功能强大,适合复杂格式的场景。
  • % 运算符:了解即可,主要用于维护一些老代码。

实例

python 复制代码
# f-string: 动态生成清晰的断言失败信息
user_id = 101
expected_status = 200
actual_status = 404
# 在测试报告中,这样的信息一目了然
error_message = f"Test for user {user_id} failed: Expected status {expected_status}, but got {actual_status}."
print(error_message)
# 输出: Test for user 101 failed: Expected status 200, but got 404.
# f-string: 构建带参数的URL
product_id = "xyz-123"
api_url = f"https://api.shop.com/products/{product_id}/details"
# 结果: 'https://api.shop.com/products/xyz-123/details'

4. 编码解码:处理中文和特殊字符

  • 基本概念:简单理解 ASCII 和 Unicode。
  • .encode().decode():解决乱码问题的根本,确保数据在不同系统间正确传输。

实例

python 复制代码
# 场景:从网络接收或从文件读取字节流,需要转换为可读字符串
# 假设我们从API接收到一个UTF-8编码的字节响应
response_body_bytes = b'{"message": "\u64cd\u4f5c\u6210\u529f"}'
# 解码为Python字符串
response_body_str = response_body_bytes.decode('utf-8')
# 结果: '{"message": "操作成功"}'
# 场景:需要将字符串发送给一个只接受特定编码(如GBK)的旧系统
data_to_send = "用户信息"
encoded_data = data_to_send.encode('gbk')
# encoded_data现在是字节串,可以发送

5. 高级技巧:正则表达式

  • 为什么需要正则:当简单的查找和分割无法满足复杂模式匹配时。
  • re 模块核心用法
    • re.match() vs re.search():从开头匹配 vs 全文搜索。
    • re.findall():提取所有匹配项,比如从日志中批量提取IP地址或时间戳。
    • re.sub():强大的查找替换功能。

实例

python 复制代码
import re
# re.findall(): 从日志中批量提取所有IP地址
log_text = """
192.168.1.1 - - [10/Oct/2023:13:55:36] "GET /api/v1/users"
10.0.0.2 - - [10/Oct/2023:13:56:01] "POST /api/v1/login"
"""
ip_addresses = re.findall(r'\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b', log_text)
# ip_addresses -> ['192.168.1.1', '10.0.0.2']
# re.search(): 验证一个字符串是否为有效的邮箱格式
email = "test.engineer@example.com"
if re.search(r'[\w\.-]+@[\w\.-]+', email):
    print(f"'{email}' 是一个有效的邮箱格式")
# re.sub(): 将日志中的时间戳替换为统一格式
log_line = "Error occurred at 13:55:36 on 10/Oct/2023"
normalized_log = re.sub(r'(\d{2}:\d{2}:\d{2}) on (\d{2}/\w{3}/\d{4})', r'\2 \1', log_line)
# 结果: "Error occurred at 10/Oct/2023 13:55:36"

6. 实战演练:学以致用

  • 案例一:日志文件解析
    • 读取日志,提取关键信息(如时间、级别、错误代码)。
    • 使用 split() 和正则表达式进行结构化处理。
  • 案例二:API响应验证
    • 解析返回的JSON字符串,检查特定字段的值是否符合预期。
    • 使用字符串方法验证状态码或消息内容。
  • 案例三:测试数据生成
    • 批量生成符合特定格式的用户名、邮箱或随机字符串。

实例

python 复制代码
import random
import string
# 案例:生成指定格式的测试数据
def generate_test_email(domain="testmail.com"):
    """生成一个随机的测试邮箱"""
    username = ''.join(random.choices(string.ascii_lowercase + string.digits, k=8))
    return f"{username}@{domain}"
def generate_test_phone():
    """生成一个随机的测试手机号(以138开头)"""
    suffix = ''.join(random.choices(string.digits, k=8))
    return f"138{suffix}"
# 生成10个测试邮箱
test_emails = [generate_test_email() for _ in range(10)]
# 生成5个测试手机号
test_phones = [generate_test_phone() for _ in range(5)]
print("Generated Emails:", test_emails)
print("Generated Phones:", test_phones)

7. 总结与拓展

- 回顾:梳理字符串操作的核心思路。

掌握字符串操作,不仅仅是记住一个个孤立的方法,更重要的是建立一套清晰的处理思路。在测试工作中,我们面对字符串时,通常遵循以下流程:

获取与读取:字符串从哪里来?

来源:API响应、数据库查询结果、日志文件、配置文件、用户输入等。

思考:首先要确保你拿到了正确的原始字符串。

清洗与标准化:让数据变得规整。

目的:消除格式差异,方便后续处理。

常用操作:去除首尾空白(strip())、统一大小写(lower()/upper())、移除不必要的换行符。

实例:从文件读取的配置项 " true ",先用 strip() 变成 "true" 再做布尔判断。

解析与提取:从大段文本中找到你关心的部分。

目的:定位关键信息,如状态码、错误消息、特定ID。

常用操作:

简单分割:用 split() 处理结构清晰的文本(如CSV)。

模式匹配:用正则表达式 re.findall() 提取所有符合复杂规则的项(如IP地址、邮箱)。

精准定位:用 find() 或切片 [start:end] 获取子串。

验证与断言:检查提取的内容是否符合预期。

目的:这是测试的核心环节。

常用操作:

精确比较:==。

包含关系:in。

模式匹配:re.search() 验证格式是否正确。

实例:断言API返回的错误信息中包含"Invalid Token"字样。

构建与生成:创建新的字符串用于请求或报告。

目的:构造API请求参数、生成测试数据、格式化输出测试报告。

常用操作:f-string 是首选,join() 用于拼接列表。

这个**"获取 -> 清洗 -> 提取 -> 验证 -> 构建"**的流程,基本能覆盖你90%的字符串处理场景。

- 拓展:了解字符串的性能特点,在处理超长文本时如何优化。

在处理少量数据时,字符串操作的性能差异可以忽略不计。但当你需要处理超大日志文件(几百MB甚至GB级别)或生成海量测试数据时,选择高效的方法就至关重要。

  1. 字符串的不可变性
    Python的字符串是不可变的。这意味着任何对字符串的"修改"操作,如拼接、替换,实际上都是在内存中创建了一个全新的字符串。

s = "hello"

s += " world" # 这一步并非在原字符串上追加,而是创建了新字符串 "hello world" 并让 s 指向它

这个特性是导致某些操作性能低下的根源。

  1. 高效拼接:join() vs +
    在循环中反复使用 + 或 += 来拼接字符串是一个经典的性能陷阱。

低效示例(应避免):

假设我们要拼接10000行日志

lines = ["log line 1", "log line 2", ...] # 共10000个元素

full_log = ""

for line in lines:

full_log += line + "\n" # 每次循环都会创建一个新字符串,非常慢!

高效示例(推荐):

lines = ["log line 1", "log line 2", ...] # 共10000个元素

1. 先将所有部分放入一个列表

log_parts = []

for line in lines:

log_parts.append(line)

log_parts.append("\n")

2. 使用 join() 一次性完成拼接,内部做了优化,速度极快

full_log = "".join(log_parts)

核心原则:当需要拼接多个字符串时,先将它们收集到列表中,最后用 ''.join(list) 一次性完成。

3. 正则表达式的性能

正则表达式非常强大,但编译模式需要时间。如果在循环中反复使用同一个正则表达式,最好预编译它。

低效示例:

import re

data_list = ["email1@test.com", "not an email", "email2@test.com"]

for item in data_list:

每次循环,re.search 都需要重新解析 '.@. .com' 这个模式字符串

if re.search(r'.@. ...*', item):

print(f"Found email: {item}")

高效示例(推荐):

import re

1. 在循环外预编译正则表达式模式

email_pattern = re.compile(r'.@....*')

data_list = ["email1@test.com", "not an email", "email2@test.com"]

for item in data_list:

2. 循环内直接使用预编译好的模式对象,速度更快
复制代码
if email_pattern.search(item):
    print(f"Found email: {item}")

核心原则:对于需要重复使用的正则表达式,使用 re.compile() 进行预编译。

记住这些性能优化的要点,能让你的测试脚本在处理大数据时依然保持高效和稳定。

相关推荐
子午1 小时前
【岩石种类识别系统】Python+TensorFlow+Django+人工智能+深度学习+卷积神经网络算法
人工智能·python·深度学习
CHANG_THE_WORLD1 小时前
Python 可变参数详解与代码示例
java·前端·python
渡我白衣1 小时前
计算机组成原理(3):计算机软件
java·c语言·开发语言·jvm·c++·人工智能·python
小霖家的混江龙2 小时前
Token 到底怎么来的? 一文读懂大模型分词的核心逻辑, 看完秒懂!
人工智能·python·llm
曲幽2 小时前
Flask进阶必备:掌握中间件、钩子和扩展
python·flask·web·request·cors·wsgi
hiber9872 小时前
SLM-Lab安装过程(踩坑过程)
python·slm-lab
我的xiaodoujiao2 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 30--开源电商商城系统项目实战--配置测试环境地址
python·学习·测试工具·pytest
海上飞猪2 小时前
【Python】JSON的基本使用-JSON 模式(Schema)与数据解析
开发语言·python·json
4***99742 小时前
工业网关助力Altivar320与S7-1200协同运行
ide·python·算法·spring·eclipse·sqlite·tornado