You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将莎士比亚十四行诗文本文件解析为三维数组以提取指定位置词汇

如何将莎士比亚十四行诗文本文件解析为三维数组以提取指定位置词汇

嘿,我完全懂你想要实现的目标——把莎士比亚的十四行诗拆成三维数组,这样就能像sonnets[1][4][2]一样直接定位到某首诗某行的某个词对吧?你的标点处理思路没问题,接下来咱们一步步把剩下的逻辑补全:

首先先明确咱们的拆解目标:

  • 第一层数组:对应每一首完整的十四行诗
  • 第二层数组:对应单首诗里的每一行内容
  • 第三层数组:对应单行里的每个单词(已去除标点)

第一步:读取并预处理文本(优化你的标点处理)

你原来的标点处理逻辑是可行的,我稍微调整了下,同时处理掉多余的换行和空格,让后续分割更顺畅:

import string

# 用with语句读取文件,更安全规范
with open("sonnets.txt", "r") as f:
    content = f.read()

# 去除所有标点符号
exclude = set(string.punctuation)
content = ''.join(ch for ch in content if ch not in exclude)

# 把连续的多换行转换成单个换行,避免后续分割出空内容
content = content.replace('\n\n\n', '\n\n').replace('\n\n', '\n')

第二步:按十四行诗分割文本

观察你的文本格式,每首诗之间是多个空行分隔,而且每首诗开头都有罗马数字编号(比如"I."、"II.")。咱们可以按这个规律拆分:

# 按空行分割成单个诗的块
sonnet_blocks = content.split('\n\n')

# 过滤掉空块(比如文件开头/结尾的空行)
sonnet_blocks = [block.strip() for block in sonnet_blocks if block.strip()]

# 把每个诗块转换成二维数组(行→单词),再组装成三维数组
sonnets_3d = []
for block in sonnet_blocks:
    # 把诗块拆成每行
    lines = block.split('\n')
    # 过滤掉编号行(比如开头的"I.",这类行短且以句点结尾)
    valid_lines = [line.strip() for line in lines if line.strip() and not line.strip().endswith('.')]
    # 把每行拆成单词,过滤掉空字符串(避免多空格导致的空单词)
    line_words = []
    for line in valid_lines:
        words = [word.strip() for word in line.split() if word.strip()]
        line_words.append(words)
    sonnets_3d.append(line_words)

第三步:测试你的定位需求

现在你就可以用索引直接定位了!比如你说的「第二首诗第五行的第三个单词」,因为Python是0索引,所以用sonnets_3d[1][4][2]就能获取到。

拿你提供的示例文本测试:第二首诗第五行去掉标点后是Then being askd where all thy beauty lies,第三个单词是askd,运行print(sonnets_3d[1][4][2])就会输出这个结果,完全符合预期。

额外优化小提示

  • 如果担心编号行的判断不够精准,可以用正则表达式匹配罗马数字格式,比如import re后,用if not re.match(r'^[IVXLCDM]+\.$', line.strip())来过滤编号行。
  • 如果想要单词统一小写,可以在拆分单词时改成word.strip().lower()。

这样整个流程就通啦,你可以根据自己的需求再调整细节~

备注:内容来源于stack exchange,提问作者BrRo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 12:32:58