如何用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
相关产品推荐
相关产品推荐

