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

如何改进正则表达式以从紧凑字符串提取多类身份及地址信息

正则表达式改进方案

直接用下面的正则表达式就能一次性提取所有需要的字段:

r"([A-Z][a-z]+)([A-Z][a-z]+)([1-9]\d{10})(\+372\s\d{8})(\d{2}-\d{2}-\d{4})(.*)"

各部分匹配逻辑:

  • ([A-Z][a-z]+):匹配名字,严格遵循大写字母开头,后跟任意数量小写字母的规则,刚好捕获Priit;
  • 第二个([A-Z][a-z]+):匹配姓氏,和名字规则完全一致,捕获Pann;
  • ([1-9]\d{10}):匹配11位身份证号,确保第一位不为0,捕获39712047623;
  • (\+372\s\d{8}):精确匹配带区号的电话号码,锁定+372后跟空格和8位数字的格式,捕获+372 56887364;
  • (\d{2}-\d{2}-\d{4}):匹配dd-mm-yyyy格式的出生日期,捕获02-12-1998;
  • (.*):匹配剩余所有内容作为地址,捕获Oja 18-2,Pärnumaa,Are。

验证提取结果

用Python测试的代码示例:

import re

target_str = "PriitPann39712047623+372 5688736402-12-1998Oja 18-2,Pärnumaa,Are"
pattern = r"([A-Z][a-z]+)([A-Z][a-z]+)([1-9]\d{10})(\+372\s\d{8})(\d{2}-\d{2}-\d{4})(.*)"
match_result = re.match(pattern, target_str)
if match_result:
    print(match_result.groups())

输出结果:
('Priit', 'Pann', '39712047623', '+372 56887364', '02-12-1998', 'Oja 18-2,Pärnumaa,Are')
完全符合预期要求。

问题根源说明

你之前的正则只覆盖了身份证、电话、出生日期三个字段,没处理名字姓氏的拆分逻辑;而^[^0-9]*会把开头所有非数字内容(PriitPann)一次性匹配,无法拆分两个独立的姓名部分。用[A-Z][a-z]+逐个匹配大写开头的小写序列,刚好能精准拆分名字和姓氏——因为两者都是独立的「大写开头+小写后缀」结构,连在一起时能被两个表达式分别捕获。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:30:56