如何使用Python解析含对话与描述的文本并分离为两个独立字符串?
批量提取文本中的对话与场景描述(Python实现)
嘿,我懂你现在需要批量处理一堆混合了对话和场景描述的文本,把人物说的话提取成字符串x,把所有场景相关的内容提取成y。结合你给的示例文本,我整理了一个实用的Python解决方案,应该能帮你搞定!
先理清楚文本结构
从你的例子来看,场景描述分两类:
- 被**中文全角括号
()**包裹的动作/状态细节,比如(快速装上最后几颗子弹) - 纯叙述性的场景内容,比如
出租车在大型立交桥的最高层高速公路路肩上急刹停下。多平德停下计价器,递给死侍他的名片。
而对话就是人物直接说的内容,比如没时间。就今天不行。十、十一、十二…不成功便成仁。就在这儿!
实现思路
我用正则表达式来处理括号内容,再通过简单的规则区分对话和场景叙述,步骤如下:
- 先把所有括号里的场景内容提取出来,同时把原文本里的括号内容删掉
- 把剩下的文本按中文标点分句,方便逐个判断是对话还是场景
- 用自定义规则区分对话和场景叙述(比如带感叹号/问号、数字计数的句子大概率是对话)
- 把所有对话合并成x,所有场景内容(括号里的+场景叙述)合并成y
- 写个批量处理函数,搞定文件里的所有文本实例
完整代码示例
import re from typing import Tuple def extract_dialogue_and_scene(text: str) -> Tuple[str, str]: # 提取所有中文括号内的场景内容,兼容换行 bracket_pattern = re.compile(r'((.*?))', re.DOTALL) scene_from_brackets = bracket_pattern.findall(text) # 移除原文本中的括号内容,得到干净的纯文本 clean_text = bracket_pattern.sub('', text).strip() # 按中文句号、感叹号、问号分割句子,保证每个句子完整 sentence_splitter = re.compile(r'([。!?]+)') text_parts = sentence_splitter.split(clean_text) sentences = [] # 把分割后的内容重新组合成完整句子 for i in range(0, len(text_parts)-1, 2): full_sentence = text_parts[i] + text_parts[i+1] if full_sentence.strip(): sentences.append(full_sentence.strip()) # 区分对话和场景叙述,这里的规则可以根据你的文本调整! dialogue_lines = [] scene_narratives = [] for sent in sentences: # 规则:带感叹号/问号、数字计数的句子视为对话,其余为场景叙述 if '!' in sent or '?' in sent or re.search(r'[零一二三四五六七八九十]+、', sent): dialogue_lines.append(sent) else: scene_narratives.append(sent) # 合并最终结果 x = ' '.join(dialogue_lines) y = ';'.join(scene_from_brackets + scene_narratives) return x, y # 测试你的示例文本 sample_text = "没时间。就今天不行。(快速装上最后几颗子弹)十、十一、十二…不成功便成仁。(给每把枪都上膛,抬头)就在这儿!出租车在大型立交桥的最高层高速公路路肩上急刹停下。多平德停下计价器,递给死侍他的名片。" dialogue_x, scene_y = extract_dialogue_and_scene(sample_text) print("提取的对话x:", dialogue_x) print("提取的场景描述y:", scene_y) # 批量处理文件中的文本实例(假设每行一个文本实例) def batch_process(input_file: str, output_file: str = 'processed_results.txt'): with open(input_file, 'r', encoding='utf-8') as f: all_texts = [line.strip() for line in f if line.strip()] processed_results = [] for idx, text in enumerate(all_texts, 1): x, y = extract_dialogue_and_scene(text) processed_results.append(f"实例{idx}:\n对话:{x}\n场景描述:{y}\n") # 把结果写入输出文件 with open(output_file, 'w', encoding='utf-8') as f: f.write('\n'.join(processed_results)) print(f"批量处理完成!结果已保存到 {output_file}") # 调用批量处理(替换成你的输入文件路径) # batch_process('your_text_file.txt')
一些可以优化的点
- 如果你的文本里有半角括号
(),可以把正则里的()改成[()()]来兼容 - 如果对话有明确的说话人标记(比如“死侍:”“多平德说:”),可以修改规则,用正则匹配这些前缀,这样准确率会更高
- 要是文本里有换行,
re.DOTALL已经帮你处理了,不用担心括号内容跨行会匹配不到
内容的提问来源于stack exchange,提问作者VihanAgarwal
相关产品推荐
相关产品推荐

