如何用正则表达式提取DD/MM/YYYY格式发票日期前的数据?
解决方案:提取DD/MM/YYYY日期前的发票编号
问题背景
需提取发票编号,已知唯一规律是发票编号后紧跟DD/MM/YYYY格式的日期,原正则因发票编号格式多样失效。
原尝试正则:
(\d{7,8})|([A-Za-z0-9\/]{12})|([0-9\/-]{8,9})
可行正则表达式
基础版本(匹配任意DD/MM/YYYY格式日期)
^(.*?)\s+\d{2}/\d{2}/\d{4}$
严谨版本(校验日期合法性,限制日01-31、月01-12)
^(.*?)\s+(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/\d{4}$
正则说明
^:锁定字符串起始位置(.*?):非贪婪捕获任意字符,确保仅提取日期前的发票编号内容\s+:匹配发票编号与日期之间的一个或多个空格分隔符- 日期匹配部分:
- 基础版
\d{2}/\d{2}/\d{4}:简单匹配两位日/两位月/四位年的格式 - 严谨版通过正则限制日、月的合法范围,避免匹配无效日期
- 基础版
$:锁定字符串结束位置
使用示例(Python)
import re sample_data = [ "91504458 26/04/2022", "TYRES/REEXPORT 04/07/2022", "TYRES/RE-EXPORT 23/09/2022", "SAM0112/2022 23/05/2021", "020/22-23 17/02/2022", "SAM0141/2022 19/03/1975", "91/22-23 01/01/2022", "SAM0159/2022 15/08/2021", "111/22-23 09/09/2021", "SAM0106/2022 09/09/2022", "017/2022 08/08/2022", "91/22-23 07/07/2022" ] pattern = re.compile(r'^(.*?)\s+\d{2}/\d{2}/\d{4}$') for line in sample_data: match = pattern.match(line) if match: print(match.group(1))
运行输出与预期完全一致:
91504458 TYRES/REEXPORT TYRES/RE-EXPORT SAM0112/2022 020/22-23 SAM0141/2022 91/22-23 SAM0159/2022 111/22-23 SAM0106/2022 017/2022 91/22-23
内容的提问来源于stack exchange,提问作者manjesh kumar
相关产品推荐
相关产品推荐

