如何使用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
相关产品推荐
相关产品推荐

