🐸

噪声卷轴

数据与文本工具python-data-tinkerer-33-the-noisy-scroll
奖励: 170 XP
|

噪声卷轴

Hoppy 在侦探台的角落里摊开一卷薄薄的卷轴。上面的线索没有完全坏掉,但每一行都沾着一点噪声:前缀记号、挤在一起的波浪符、还有多出来的问号,让它一眼看上去比真实内容更乱。

这正是 Chapter 5 想确认你的地方:面对不太整洁的文本,你不会停在“看起来好乱”,而是知道先清理,再拆开,再把结果整理清楚。

带噪声的文本,通常要先清理,再解析

有些文本并不需要复杂 parser。它只是先被几种小噪声盖住了真正的形状。只要你按顺序做几步简单动作,比如 strip()replace()split(),原来的结构就会重新露出来。

sample_line = "  ## room=ivy~bridge | clue=glow | status=ready??  "
cleaned_line = sample_line.strip().replace("## ", "").replace("~", " ").replace("??", "")
room_name = cleaned_line.split(" | ")[0].split("=")[1]
print(cleaned_line)
print(room_name)

这个示例只演示“先把一行清干净,再拿一个字段”的感觉,不是今天 starter 的整题答案。真正任务里,你会对一整份小卷轴连续做几步清理,然后再把结果收起来。

今天的任务:把一份噪声卷轴清成可用结果

starter 已经帮你读好了 noisy_scroll.txt,并先做了 scroll_lines = scroll_text.splitlines()。你要继续把三行卷轴都清理干净,得到 first_clean_linemiddle_clean_linelast_clean_linecleaned_lines,再从里面提取 first_roommiddle_statuslast_clue,最后整理成 scroll_report

1
先观察原始卷轴是怎样按行摆开的

运行 starter,先看 scroll_textscroll_lines。注意:它还不是干净结果,但已经帮你把整份卷轴拆成了一行一行的小片段。

2
对每一行重复同样的清理动作

每一行都先 strip(),再去掉开头的 "## ",再把 "~" 换成空格,把 "??" 去掉。这样三行都会回到同一种清楚的形状。

3
从清理后的行里提取几个重点字段

清理完以后,每一行都像 room=... | clue=... | status=...。这时再用 split(" | ")split("="),分别拿出 first_roommiddle_statuslast_clue

4
把 Chapter 5 的 checkpoint 结果收进 scroll_report

cleaned_countfirst_roommiddle_statuslast_clue 构造一个 scroll_report 字典。这样你不只是把文本清干净了,也把结果整理清楚了。

保持这个 checkpoint 小而完整

这节课不是大型综合项目,也不是世界观终试炼。我们不引入新概念,不做复杂 parser,只确认你已经能把清理、拆解和组织结果这几步自然串起来。

参考答案
点击展开
参考答案:
with open("noisy_scroll.txt", "r", encoding="utf-8") as file:
  scroll_text = file.read().strip()

print("Scroll text:")
print(scroll_text)

scroll_lines = scroll_text.splitlines()
print("Scroll lines:", scroll_lines)

first_clean_line = scroll_lines[0].strip().replace("## ", "").replace("~", " ").replace("??", "")
middle_clean_line = scroll_lines[1].strip().replace("## ", "").replace("~", " ").replace("??", "")
last_clean_line = scroll_lines[2].strip().replace("## ", "").replace("~", " ").replace("??", "")
cleaned_lines = [first_clean_line, middle_clean_line, last_clean_line]
cleaned_count = len(cleaned_lines)
first_room = cleaned_lines[0].split(" | ")[0].split("=")[1]
middle_status = cleaned_lines[1].split(" | ")[2].split("=")[1]
last_clue = cleaned_lines[2].split(" | ")[1].split("=")[1]

scroll_report = {
  "cleaned_count": cleaned_count,
  "first_room": first_room,
  "middle_status": middle_status,
  "last_clue": last_clue,
}

print("First clean line:", first_clean_line)
print("Middle clean line:", middle_clean_line)
print("Last clean line:", last_clean_line)
print("Cleaned lines:", cleaned_lines)
print("Cleaned count:", cleaned_count)
print("First room:", first_room)
print("Middle status:", middle_status)
print("Last clue:", last_clue)
print("Scroll report:", scroll_report)
高级技巧
想更进一步?点击展开

这节 checkpoint 想确认的,不是你记住了多少字符串方法名,而是你已经形成了一条稳定路径:先把噪声清掉,再按形状拆开,再把结果组织成清晰输出。

到这里,Chapter 5 的文本侦探基础就收束好了。下一章会把这些习惯放进更连续的任务里,但不会靠新概念取胜。

Loading...
终端输出
Terminal
Ready to run...