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

如何使用Python Regex提取符合指定格式的唯一发票ID

你现有代码的问题有两个:一是正则仅匹配单个连续数字串,二是re.search仅返回第一个匹配结果,所以只能拿到首个数字段2021。

你可以用带反向引用的正则配合re.findall实现需求,完整示例代码如下:

import re

# 待匹配的文本
test_str = """1) Payment of invoice nr.2021-3-5450
2) Invoice 2021 3 27 has been paid
"""

# 正则规则
invoice_pattern = re.compile(r'\b\d{4}([- ])\d{1,2}\1\d{1,4}\b')
# 提取所有符合规则的发票ID
matched_invoices = invoice_pattern.findall(test_str)

# 可选:统一将空格分隔的ID转换为横杠分隔的标准格式
standard_invoices = [item.replace(' ', '-') for item in matched_invoices]

print(matched_invoices)
# 输出:['2021-3-5450', '2021 3 27']
print(standard_invoices)
# 输出:['2021-3-5450', '2021-3-27']

正则规则说明

  • \b:匹配单词边界,避免从更长的数字串(如手机号、长编号)中错误截取片段
  • \d{4}:匹配4位年份
  • ([- ]):匹配分隔符(横杠或空格),存入分组1
  • \d{1,2}:匹配1-2位月份
  • \1:反向引用分组1的分隔符,保证前后分隔符一致,避免匹配到2021-3 27这类混合分隔符的无效内容
  • \d{1,4}:匹配1-4位客户ID,对应1到9999的取值范围
  • re.findall:返回文本中所有符合规则的匹配结果,而非仅返回第一个匹配项。

如果需要更严格的校验规则(比如限定月份为1-12、客户ID不能为0或0开头),可以将正则调整为:
r'\b\d{4}([- ])(0?[1-9]|1[012])\1([1-9]\d{0,3})\b'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:06:02