寻求可提取复杂格式账户名的健壮正则表达式方案
账户名称提取的正则优化需求
我需要从一批PDF文件的表格中提取账户名称,目前用正则实现了部分效果,但需要更健壮的表达式来提取完整名称。
当前匹配结果
测试部分复杂账户名称时,当前正则的匹配情况如下:
<re.Match object; span=(0,22), match='20/36 Advert Inc. -' <re.Match object; span=(0,14), match='COOLIDGE LLC -' <re.Match object; span=(0,20), match='YANG STREET CAPITAL ' <re.Match object; span=(0,20), match='United Money Mgmt ' <re.Match object; span=(0,13), match='JQUM (Chex ' <re.Match object; span=(0,5), match='AXEY ' <re.Match object; span=(0,9), match='RIG /COV'
当前使用的正则表达式
company_regex = re.compile(r'^[\w\d\s]+(?:[-/\.\s()]+[\w\d\s.-]+)?\s+')
需要提取的完整账户名称示例
company_1= "20/36 Advert Inc. -New York" company_2= "COOLIDGE LLC - CHARLOTTE" company_3= "YANG STREET CAPITAL MANAGEMENT" company_4= "United Money Mgmt Corp" company_5= "JQUM (Chex Stanley)" company_6= "AXEY (Mitsu+XG+JNL)" company_7= "RIG /Cov Credit"
目标表格格式
账户名称嵌入在如下格式的PDF表格中:
| Account | Allocation |
|---|---|
| 20/36 Advert Inc. - New York | 4.00k |
| COOLIDGE LLC - CHARLOTTE | 3.3m |
| United Money Mgmt Corp | 7.5m |
| JQUM (Chex Stanley) | $3.8 |
| AXEY (Mitsu+XG+JNL) | $75.8k |
| RIG /Cov Credit | 100.0k |
优化后的正则表达式
针对上述场景,推荐使用以下正则表达式:
company_regex = re.compile(r'^(.+?)(?=\s*(?:\$?\d|$))')
逻辑说明
- 采用正向预查
(?=\s*(?:\$?\d|$)),精准匹配到分配值(以$+数字或直接数字开头)之前的所有内容,自动截断账户名称和分配列的边界。 - 无需逐个枚举允许的字符,天然覆盖账户名称中包含的空格、
/、.、-、()、+等特殊格式,适配所有示例场景。
如果PDF解析后保留了HTML表格结构,也可以直接匹配<td>标签内的内容:
company_regex = re.compile(r'<td>(.+?)</td>')
提取捕获组1的内容即可得到完整账户名。
内容的提问来源于stack exchange,提问作者Jess
相关产品推荐
相关产品推荐

