Python天梯赛备考攻略:字符串篇实战解析
知识点拆解
1. 切片技巧
定义
通过 [start:end:step]
语法截取字符串的子序列
start:起始索引(包含,默认0)
end:结束索引(不包含,默认末尾)
step:步长(可为负数实现逆序)
字诀:包左不包右
核心用途
快速逆序字符串
提取特定区间的子串
间隔取字符
示例代码
#输入一个字符串s
s = "Hello,天梯赛!"
# 基本切片
print(s[0:5]) # 输出 "Hello" (索引0-4)
print(s[7:10]) # 输出 "天梯赛"
# 逆序技巧
print(s[::-1]) # 输出 "!赛梯天,olleH"
print(s[5:2:-1]) # 输出 ",ol" (从索引5到3逆序)
# 步长应用
print(s[::2]) # 输出 "Hlo天赛" (每隔1个字符取)
注意事项
索引越界时自动取有效范围(如s[0:100]等效s[0:])
原字符串不可变,切片会生成新字符串
2. 格式化输出
定义
使用 f-string
或 format()
方法控制字符串的显示格式
常用格式符
格式符号 | 功能说明 | 示例 |
---|---|---|
:>n | 右对齐,总宽度n | f"{6:>4}" → " 6" |
:<n | 左对齐,总宽度n | f"{6:<4}" → "6 " |
:^n | 居中对齐,总宽度n | f"{6:^4}" → " 6 " |
:0>n | 右侧补零到n位 | f"{6:0>4}" → "0006" |
:.2f | 保留两位小数 | f"{3.1415:.2f}" → "3.14" |
😡 | 十六进制格式 | f"{255:x }" → "ff" |
print(f"{6:>4}")
print(f"{6:<4}")
print(f"{6:^4}")
print(f"{6:0>4}")
print(f"{6:0<4}")
print(f"{6:0^4}")
#答案输出示例已在上面表格中给出
场景应用
按要求补前导零(如输出时间格式)
对齐表格数据
控制浮点数精度
示例代码
# 成绩格式化输出
name, score = "张三", 95.5
print(f"{name:<5}的成绩:{score:0>5.1f}分")
# 输出 "张三 的成绩:095.5分"
# 日期补零
month, day = 3, 8
print(f"日期:{month:0>2d}-{day:0>2d}")
# 输出 "日期:03-08"
3. 正则表达式
定义
通过特定模式匹配文本的工具,Python中通过 re
模块实现。
re.findall()提取数字/字母 匹配模式 r'\d+'(整数) / r'-?\d+'(含负数)
常用元字符
模式 | 含义 | 示例 |
---|---|---|
\d | 匹配数字 | 等价于[0-9] |
\w | 匹配字母/数字/下划线 | 等价于[a-zA-Z0-9_] |
\s | 匹配空白字符 | 包含空格、换行等 |
. | 匹配任意字符(除换行) | |
* | 匹配前字符0次或多次 | |
+ | 匹配前字符1次或多次 | |
? | 匹配前字符0或1次 |
典型应用场景
从复杂文本中提取数字/字母
验证输入格式(如邮箱、电话号码)
替换特定模式的文本
示例代码
import re
text = "订单号:AB123,金额:-45.6元,数量:2"
# findall提取所有整数(含负数)
nums = re.findall(r"-?\d+", text)
print(nums) # 输出 ['123', '-45', '6', '2']
# 分割混合字符
parts = re.split(r"(\d+)", "A12B34C")
print(parts) # 输出 ['A', '12', 'B', '34', 'C']
# 替换非数字字符
clean_str = re.sub(r"[^\d]", "", "Tel: 0571-8888-6666")
print(clean_str) # 输出 "057188886666"
正则表达式在密码强度评估器的设计中有反复使用过,他的公式套用相对比较晦涩,例如\d表示数字,+表示一个或多个,-?处理可能出现的负号等等,比较细碎可以学一个用一个,初学者以尽量知道在干什么为主。
4. 字符串转换
核心方法
方法 | 功能说明 | 时间复杂度 |
---|---|---|
.split() | 按分隔符分割为列表 | O(n) |
.join() | 合并可迭代对象为字符串 | O(n) |
.replace() | 替换子串 | O(n) |
.upper() | 转大写 | O(n) |
.strip() | 去除首尾空白 | O(n) |
应用场景对比
场景 | 推荐方法 |
---|---|
按空格分割单词 | s.split() (无参数自动处理) |
处理含多种分隔符 | re.split() |
合并路径 | "/".join(path_parts) |
批量替换多个不同字符 | .translate() |
示例代码
# 分割与合并
s = "2023-08-15"
parts = s.split("-") # ['2023', '08', '15']
new_s = "/".join(parts) # "2023/08/15"
# 多重替换
s = "Hello World"
s = s.replace("H", "J").replace("W", "") # "Jello orld"
# 快速清洗数据
dirty_str = " Price: $123.45\n"
clean_str = dirty_str.strip().replace("$", "").upper()
# 结果:"PRICE: 123.45"
综合应用示例
题目:处理用户输入的复杂字符串,提取所有整数并求和
import re
input_str = "数据:A1销售额5000元,B2销量-300件,成本-1200.5"
numbers = list(map(int, re.findall(r"-?\d+", input_str)))
total = sum(numbers) # 5000 + (-300) + (-1200) = 3800
print(f"合计:{total}")
对应练习题
L1-011 A-B(字符串删除操作)
L1-026 I Love GPLT(固定格式输出)
L1-034 点赞(统计特征字符)
作者:重生之我要成为代码大佬