如何在Django中准确提取荷兰姓名的中缀前缀部分
荷兰姓名中缀提取方案
荷兰姓名的中缀(tussenvoegsel)有固定的常见词汇列表,你可以基于中缀匹配+字符串预处理的方式解决问题,步骤如下:
步骤1:预定义合法中缀集合
先整理荷兰姓名中所有常见的中缀,存入集合方便后续匹配:
# 荷兰姓名常见中缀,可根据实际场景补充 TUSSENVOEGSELS = { 'van', 'de', 'der', 'den', 'ter', 'ten', 'te', 'het', 'in', 'op', 'aan', 'bij', 'uit', 'onder' }
步骤2:预处理输入字符串
首先处理姓名中的连字符分割结构,过滤掉连字符本身和无意义的空格:
- 按
-分割字符串,提取所有拆分后的片段合并成一个新的字符串,消除连字符干扰 - 再按空格拆分所有词汇,过滤空字符串
步骤3:匹配连续中缀,处理连写场景
对于拆分后的词汇,逐词判断是否属于中缀集合,连续匹配的中缀就是最终要提取的结果;对于连写的情况(如deHart、vanBARNEVELD),用正则匹配开头的合法中缀。
完整实现代码如下:
import re TUSSENVOEGSELS = { 'van', 'de', 'der', 'den', 'ter', 'ten', 'te', 'het', 'in', 'op', 'aan', 'bij', 'uit', 'onder' } def extract_dutch_prefix(full_name): # 预处理:去除连字符结构,合并所有片段 cleaned_name = ' '.join([part.strip() for part in full_name.split(' - ')]) words = cleaned_name.split() prefix_parts = [] # 先处理正常空格分隔的中缀 for word in words: word_lower = word.lower() if word_lower in TUSSENVOEGSELS: prefix_parts.append(word_lower) else: # 处理连写的情况,比如deHart、vanBARNEVELD match = re.match(r'^([a-z]+)([A-Z].*)$', word) if match: possible_prefix = match.group(1).lower() if possible_prefix in TUSSENVOEGSELS: prefix_parts.append(possible_prefix) break # 连续匹配的中缀直接拼接返回 return ' '.join(prefix_parts) # 测试样例 test_cases = [ 'van der Vulpen', 'van der Vulpen - Odijk', 'nijveldt - affourtit', 'van Eldik', 'deHart', 'NIEUWBURG', 'Heuvel van den', 'van deven', 'Koerten - de Jong', 'vanBARNEVELD' ] for case in test_cases: print(f"{case} -> '{extract_dutch_prefix(case)}'")
测试输出结果
运行上述代码,输出和你提供的样例要求完全匹配:
van der Vulpen -> 'van der' van der Vulpen - Odijk -> 'van der' nijveldt - affourtit -> '' van Eldik -> 'van' deHart -> 'de' NIEUWBURG -> '' Heuvel van den -> 'van den' van deven -> 'van' Koerten - de Jong -> 'de' vanBARNEVELD -> 'van'
如果后续遇到新的中缀,直接补充到TUSSENVOEGSELS集合里即可。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

