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

Python正则表达式提取发票中含连字符的姓名问题

解决发票姓名提取的正则问题

问题分析

原正则存在两个核心问题:

  • 正向预查(?<=Desired Name:\s{3}[A-Za-z])多匹配了姓名的第一个字符,导致结果丢失首字母(比如Friday变成riday)
  • 正则仅允许匹配纯字母字符,未包含连字符-,无法覆盖带连字符的姓名部分(比如twk-test)

修正后的正则表达式

(?<=Desired Name:\s{3})[A-Za-z]+(?:\s[A-Za-z-]+){1,2}

正则规则说明

  • (?<=Desired Name:\s{3}):正向预查,定位到Desired Name:后接3个空格的位置,不再额外匹配姓名首字符,避免丢失开头字母
  • [A-Za-z]+:匹配姓名的第一个纯字母单词
  • (?:\s[A-Za-z-]+){1,2}:非捕获组,匹配1-2个后续姓名部分,其中:
    • \s:匹配单词间的空格
    • [A-Za-z-]+:支持匹配包含字母和连字符的单词
    • {1,2}:满足姓名为2-3个连续单词的要求

Python 3.9 代码示例

import re

# 示例发票文本
invoice_content = "Desired Name:   Friday twk-test"
# 编译正则模式
name_pattern = re.compile(r'(?<=Desired Name:\s{3})[A-Za-z]+(?:\s[A-Za-z-]+){1,2}')
# 执行匹配
matched_name = name_pattern.search(invoice_content)

if matched_name:
    print("提取到的姓名:", matched_name.group())  # 输出:提取到的姓名: Friday twk-test
else:
    print("未匹配到有效姓名")

适配优化

如果发票中Desired Name:后的空格数量不固定(不一定是3个),可将\s{3}替换为\s+,适配任意数量的空白字符:

(?<=Desired Name:\s+)[A-Za-z]+(?:\s[A-Za-z-]+){1,2}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 03:15:36