正则实现指定词汇免替换的姓名匿名化函数优化需求
解决姓名匿名化时误替换指定机构名的问题
核心思路
先将需要保留的机构名单转换为正则匹配规则,在识别姓名时优先跳过这些机构名,仅对不在保留列表内、符合首字母大写格式的词汇执行匿名替换。
实现代码(Python)
假设我们有如下需保留的机构列表:
reserved_institutions = ["Universiteit van Amsterdam", "Harvard University", "Oxford College"]
构建正则规则,先匹配需保留的机构(避免被替换),再匹配需匿名的姓名:
import re def anonymize_names_with_reservation(text, reserved_list): # 转义保留列表中的特殊字符,避免正则语法冲突 reserved_pattern = "|".join(re.escape(inst) for inst in reserved_list) # 正则规则:先匹配保留机构(捕获组1),再匹配首字母大写的单/多词姓名(捕获组2) pattern = re.compile(f'({reserved_pattern})|([A-Z][a-z]+(?: [A-Z][a-z]+)*)') def replace_match(match): # 匹配到保留机构则直接返回原内容 if match.group(1): return match.group(1) # 匹配到姓名则替换为匿名标识 else: return "[ANONYMIZED_NAME]" return pattern.sub(replace_match, text)
测试示例
测试文本:
"John Doe works at Universiteit van Amsterdam, and Jane Smith studies at Harvard University."
调用函数:
test_text = "John Doe works at Universiteit van Amsterdam, and Jane Smith studies at Harvard University." result = anonymize_names_with_reservation(test_text, reserved_institutions) print(result)
输出结果:
"[ANONYMIZED_NAME] [ANONYMIZED_NAME] works at Universiteit van Amsterdam, and [ANONYMIZED_NAME] [ANONYMIZED_NAME] studies at Harvard University."
关键说明
re.escape()用于处理机构名中的特殊字符,防止正则解析出错- 正则内的
(?: [A-Z][a-z]+)*用来匹配多词姓名(如John Doe),且不生成额外捕获组 - 回调函数优先判断是否匹配保留机构,确保这类词汇不会被误替换
内容的提问来源于stack exchange,提问作者Leyla Elkhamlichi
相关产品推荐
相关产品推荐

