如何用正则表达式提取PO编号后的字母数字值?
解决PO编号提取的正则问题
原代码的问题在于正则表达式的分组设计:PO# (\w+)|PO NUMBER (\w+) 包含两个独立的捕获分组,当匹配到PO NUMBER时,目标编号实际在第二个分组(group(2)),但代码只读取了第一个分组(group(1)),导致无法正确输出结果。
修正方案
使用非捕获组统一两种前缀格式,确保目标编号始终在同一个捕获分组中,同时支持前缀与编号之间的任意空白字符(适配更多文本场景):
import re text = """THE PO NUMBER 134314 MUST BE INCLUDED ALONG WITH SERVICE DATE ON ALL INVOICES SUBMITTED THROUGH THE AVID BILL PAY PROCESS. THANK YOU.""" # 非捕获组匹配PO#或PO NUMBER,捕获后续的字母数字编号 p_no = re.search(r"(?:PO#|PO NUMBER)\s+(\w+)", text) if p_no is None: print("No value found") else: print(p_no.group(1))
代码说明
(?:PO#|PO NUMBER):非捕获组,用来匹配两种前缀格式,不会生成多余的捕获分组\s+:匹配前缀与编号之间的一个或多个空白字符(包括空格、换行等),提升兼容性(\w+):捕获后续的字母数字组合,支持纯数字、字母数字混合的PO编号格式- 无论匹配哪种前缀,目标编号都存储在
group(1)中,彻底避免分组错位问题
执行后输出:134314,完全符合需求。
内容的提问来源于stack exchange,提问作者Ajay
相关产品推荐
相关产品推荐

