Python正则提取混杂文本姓名并转换为标准名前姓后格式问题
混杂文本中姓名提取与格式标准化方案
核心需求
- 从混杂电话号码的无规则字符串中提取所有姓名,统一调整为名 姓的标准顺序
- 处理过程需完整保留
Dr.、Rev.等头衔前缀,以及中间名、姓名缩写内容 - 初步正则提取的结果中,部分姓名为「姓, 名」的倒置格式,需通过后处理修正顺序
参考材料
- 待处理原始字符串:
s = "555-1239Dr. Bernard Lander(636) 555-0113Hollingdorp, Donnatella555-6542Fitzgerald, F. Scott555 8904Rev. Martin Luther King636-555-3226Snodgrass, Theodore5553642Carlamina Scarfoni"
- 初步提取代码:
import re Title = r"(?:[A-Z][a-z]*\.\s*)?" Name1 = r"[A-Z][a-z]+,?\s+" Middle = r"(?:[A-Z][a-z]*\.?\s*)?" Name2 = r"[A-Z][a-z]+" raw_names = re.findall(Title + Name1 + Middle + Name2, s)
- 初步提取结果:
['Dr. Bernard Lander', 'Hollingdorp, Donnatella', 'Fitzgerald, F. Scott', 'Rev. Martin Luther King', 'Snodgrass, Theodore', 'Carlamina Scarfoni']
- 目标输出要求:倒置的「姓, 名」格式调整为正序,其余内容完整保留
实现方案
原有正则已经可以准确从混杂文本中提取出完整姓名,仅需要对提取结果做简单后处理即可:识别带逗号的倒置姓名,拆分后将逗号后的名/中间名部分提前,逗号前的姓氏移动到末尾即可,无需修改原有提取正则。
完整可运行代码:
import re def process_names(input_str): # 沿用原有成熟的正则提取逻辑 Title = r"(?:[A-Z][a-z]*\.\s*)?" Name1 = r"[A-Z][a-z]+,?\s+" Middle = r"(?:[A-Z][a-z]*\.?\s*)?" Name2 = r"[A-Z][a-z]+" raw_names = re.findall(Title + Name1 + Middle + Name2, input_str) result = [] for name in raw_names: # 先分离头衔(如果存在),避免头衔干扰格式判断 title_match = re.match(r"^([A-Z][a-z]*\.\s+)", name) title = title_match.group(1) if title_match else "" name_body = name[len(title):] if "," in name_body: # 倒置格式:拆分姓和名部分,重组为正序 last_name, first_middle = name_body.split(",", 1) fixed_name = f"{first_middle.strip()} {last_name.strip()}" result.append(title + fixed_name) else: # 原本就是正序格式,直接保留 result.append(name) return result # 测试运行 s = "555-1239Dr. Bernard Lander(636) 555-0113Hollingdorp, Donnatella555-6542Fitzgerald, F. Scott555 8904Rev. Martin Luther King636-555-3226Snodgrass, Theodore5553642Carlamina Scarfoni" print(process_names(s))
运行结果
['Dr. Bernard Lander', 'Donnatella Hollingdorp', 'F. Scott Fitzgerald', 'Rev. Martin Luther King', 'Theodore Snodgrass', 'Carlamina Scarfoni']
说明:输出中
F. Scott Fitzgerald为通用标准姓名顺序,若需调整为指定的特殊顺序,仅需修改倒置姓名拆分后的拼接规则即可。
内容的提问来源于stack exchange,提问作者Adita Rita
相关产品推荐
相关产品推荐

