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

