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

如何用Python正则提取《罗密欧与朱丽叶》中罗密欧对朱丽叶的台词

解决《罗密欧与朱丽叶》罗密欧台词提取问题

原代码核心问题

  • 变量名冲突:循环中复用lines变量,覆盖了初始定义的空列表,导致逻辑混乱。
  • 正则匹配逻辑错误:\\ARom.匹配的是整个字符串的开头而非行开头,且仅匹配含角色名的行,未提取后续同角色的台词内容。
  • 错误拆分文本:sent_tokenize按句子拆分台词,破坏了剧本中“角色+连续台词”的结构,导致台词被拆碎。

修正方案:按行跟踪角色提取台词

假设你的TXT文件格式为「角色缩写. 台词」,后续同角色台词无角色名直接换行,可使用以下代码:

import re

def extract_romeo_lines(full_text):
    romeo_lines = []
    current_speaker = None
    # 按行拆分文本,保留台词结构
    all_lines = full_text.strip().split('\n')
    
    for line in all_lines:
        line = line.strip()
        # 匹配角色名行(如 Rom.、Jul.)
        speaker_match = re.match(r'^([A-Za-z]+)\.', line)
        if speaker_match:
            current_speaker = speaker_match.group(1)
            # 若当前是罗密欧,提取该行台词部分
            if current_speaker == 'Rom':
                content = re.sub(r'^Rom\. ', '', line).strip()
                if content:
                    romeo_lines.append(content)
        else:
            # 当前说话者是罗密欧且行非空,追加台词
            if current_speaker == 'Rom' and line:
                romeo_lines.append(line)
    return romeo_lines

# 读取文件并提取
with open('romeo_juliet.txt', 'r', encoding='utf-8') as f:
    full_text = f.read()

romeo_lines = extract_romeo_lines(full_text)
for line in romeo_lines:
    print(line)

关键优化点

  • 按行拆分文本,保留剧本的台词块结构,避免sent_tokenize的过度拆分。
  • 跟踪当前说话角色,收集所有属于罗密欧的连续台词,包括角色名行后的多行内容。
  • 用re.match精准匹配行首的角色名,转义点号避免匹配任意字符。

内容的提问来源于stack exchange,提问作者Jimpppp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:05:22