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
相关产品推荐
相关产品推荐

