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

如何使用正则提取‘passport’关键词后的多个匹配护照号码?

提取passport关键词后所有护照号码的正则解决方案

你的原正则只能匹配第一个号码,核心问题是它仅做单次匹配,没有覆盖passport之后所有符合格式的号码。这里提供两种可行的解决思路:

思路1:先定位passport后的文本段,再全局匹配所有号码

先提取passport之后的全部内容,再在这个范围内匹配所有符合格式的护照号,兼容性强,适合大多数正则引擎:

代码示例(Python)

import re
text = 'my friends passport numbers are V123456, V123457 and V123458'

# 第一步:提取passport之后的所有文本
passport_content = re.search(r'(?<=passport).*', text, re.DOTALL).group()

# 第二步:在提取的文本中匹配所有符合格式的护照号
pattern = r'\b[a-zA-Z]{0,2}\d{6,12}[a-zA-Z]{0,2}\b'
all_passports = re.findall(pattern, passport_content)

print(all_passports)  # 输出: ['V123456', 'V123457', 'V123458']

思路2:用可变长度正向预查直接全局匹配

如果你的正则引擎支持可变长度正向预查(比如Python、Java、C#的正则库),可以直接用一条正则全局匹配所有在passport之后的号码:

正则表达式

(?<=passport.*?)\b[a-zA-Z]{0,2}\d{6,12}[a-zA-Z]{0,2}\b

代码示例(Python)

import re
text = 'my friends passport numbers are V123456, V123457 and V123458'
pattern = r'(?<=passport.*?)\b[a-zA-Z]{0,2}\d{6,12}[a-zA-Z]{0,2}\b'
all_passports = re.findall(pattern, text)
print(all_passports)  # 输出: ['V123456', 'V123457', 'V123458']

补充说明

  • 原正则的问题:(?:\w+\s){0,10}\s*(\b...\b)的结构只能捕获passport之后的第一个符合号码,没有全局遍历逻辑,因此只能拿到第一个结果。
  • 如果护照号周围带有标点(比如逗号),可以调整正则忽略这些干扰,比如用\b([a-zA-Z]{0,2}\d{6,12}[a-zA-Z]{0,2})\b,通过捕获组获取干净的号码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 09:27:35