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

Python实现按发言人尊称及大写姓氏分类文本的技术问询

按发言人性别拆分国会文本文件的解决方案

需求描述:需将AllCongress.txt文件中的内容按发言人性别拆分至两个独立文件。文件中男性发言人格式为"Mr. XYZ"(XYZ为3个及以上连续大写字母),女性发言人格式为"Ms. XYZ"或"Mrs. XYZ"。需提取每个发言人标识后的文本并按性别分类,直至下一位发言人出现。本人为Python新手,无法实现检测该发言人格式的逻辑,上述为尝试实现的未完成混乱代码,寻求检测该格式的方法。

嘿,作为Python新手能尝试自己写代码已经很棒了!你的需求其实非常适合用正则表达式来解决,因为我们需要匹配特定格式的发言人标识,正则能高效搞定这种模式匹配问题。下面一步步给你讲清楚实现方法:

1. 明确匹配规则与正则表达式

首先我们需要精准匹配发言人的标识行:

  • 男性发言人:行开头是Mr. ,后面跟着3个及以上连续大写字母(比如Mr. SMITH)
  • 女性发言人:行开头是Ms. 或Mrs. ,后面跟着3个及以上连续大写字母(比如Ms. JOHNSON、Mrs. WILLIAMS)

对应可以写出这样的正则表达式:

import re
speaker_pattern = re.compile(r'^(Mr\.|Ms\.|Mrs\.) ([A-Z]{3,})$')

简单解释下这个正则:

  • ^:匹配行的开头,确保我们只识别作为发言人开头的行
  • (Mr\.|Ms\.|Mrs\.):捕获发言人的头衔,注意.要转义成\.(因为.在正则里代表任意字符)
  • ([A-Z]{3,}):捕获3个及以上的大写字母姓名
  • $:匹配行的结尾,确保这一行就是完整的发言人标识

2. 完整Python代码实现

下面是可以直接运行的完整代码,我加了详细注释,方便你理解每一步:

import re

# 定义匹配发言人的正则模式
speaker_pattern = re.compile(r'^(Mr\.|Ms\.|Mrs\.) ([A-Z]{3,})$')

# 使用with语句打开文件,自动处理文件关闭,更安全
with open('AllCongress.txt', 'r') as input_file, \
     open('MaleSpeeches.txt', 'w') as male_file, \
     open('FemaleSpeeches.txt', 'w') as female_file:
    
    current_gender = None  # 记录当前发言人的性别
    current_speech = []    # 收集当前发言人的所有发言内容
    
    for line in input_file:
        stripped_line = line.strip()
        # 检查当前行是否匹配发言人标识
        match = speaker_pattern.match(stripped_line)
        if match:
            # 如果之前有未写入的发言内容,先写入对应文件
            if current_gender and current_speech:
                if current_gender == 'male':
                    male_file.write('\n'.join(current_speech) + '\n\n')
                else:
                    female_file.write('\n'.join(current_speech) + '\n\n')
                current_speech = []  # 重置发言内容列表
            
            # 根据捕获的头衔判断性别
            title = match.group(1)
            if title == 'Mr.':
                current_gender = 'male'
                # 写入发言人标识作为分隔线,方便后续查看
                male_file.write(f'--- {stripped_line} ---\n')
            else:
                current_gender = 'female'
                female_file.write(f'--- {stripped_line} ---\n')
        else:
            # 如果不是发言人标识,且已经识别过第一个发言人,就收集内容
            if current_gender is not None:
                current_speech.append(line.rstrip('\n'))
    
    # 处理文件末尾最后一段未写入的发言内容
    if current_gender and current_speech:
        if current_gender == 'male':
            male_file.write('\n'.join(current_speech) + '\n')
        else:
            female_file.write('\n'.join(current_speech) + '\n')

print("文件拆分完成!已生成MaleSpeeches.txt和FemaleSpeeches.txt")

3. 代码关键点说明

  • with语句:自动管理文件的打开和关闭,避免忘记关闭文件导致的问题
  • 正则匹配:用match()方法只匹配行开头的内容,避免误匹配文本中间的类似字符串
  • 内容收集与写入:每次检测到新发言人时,先把上一位的发言写入对应文件,确保内容不会丢失
  • 分隔线:加入--- 发言人标识 ---的格式,让生成的文件更易读

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:07:41