如何从文本文件中灵活提取结构化字段(如订单号、客户号等)

聖光之護

聖光之護

2026-04-07

365人浏览

原创

如何从文本文件中灵活提取结构化字段(如订单号、客户号等)

本文介绍使用 python 正则表达式与键值映射字典,从格式不统一的纯文本文件中稳健提取关键业务字段(如客户号、发票号、订单日期等),支持多变关键词匹配与跨行内容捕获。

本文介绍使用 python 正则表达式与键值映射字典,从格式不统一的纯文本文件中稳健提取关键业务字段(如客户号、发票号、订单日期等),支持多变关键词匹配与跨行内容捕获。

在处理来自不同系统或人工录入的文本票据、发票或日志文件时,常见问题是:关键信息(如“Customer Nr.”、“Inv. Number:”、“Order date”)的表述形式多样、位置不固定、前后空格/标点不一致,甚至跨行出现。硬编码逐行解析极易失效。一个健壮的解决方案是构建语义映射字典 + 正则动态匹配的组合策略。

核心思路是:将业务语义(如 'Customer Number')作为统一键,其所有可能的原始文本变体(如 'customer number', 'cus. nr.', 'Customer Nr.')作为该键对应的正则候选模式;对每段文本,依次尝试各变体的模糊匹配,捕获其后紧跟的值内容。

以下是完整可运行的实现:

import re

# 定义语义键与其所有常见文本变体(支持大小写不敏感匹配)
values_dict = {
    'Customer Number': ['Customer Nr.', 'customer number', 'cus. nr.', 'Customer Number', 'Kundennummer'],
    'Order Number': ['Order number.', 'Order nr', 'order number', 'Order Number', 'Bestellnummer', 'Order #'],
    'Invoice Number': ['Invoice Nr.', 'Inv. Number:', 'invoice number', 'Invoice Number', 'Rechnungsnummer', 'INV #'],
    'Order Date': ['Order Date', 'Bestelldatum', 'Order date:', 'Datum'],
    'Company Information': ['Company Name', 'Firmenname', 'Company:', 'Lieferadresse'],
    'Invoice Company Information': ['Invoice Adress Company Name', 'Rechnungsadresse', 'Billing Address']
}

def extract_information(text: str, pattern_map: dict) -> dict:
    """
    从输入文本中提取指定语义字段的值
    支持冒号、空格分隔,自动去除首尾空白,并优先匹配首个有效变体
    """
    results = {}
    # 预编译正则以提升性能(尤其处理大量文件时)
    for key, variations in pattern_map.items():
        for variation in variations:
            # 构建鲁棒模式:匹配关键词(可选后跟 : 或空格),后接非换行符内容(贪婪捕获)
            pattern = rf"{re.escape(variation)}\s*[:\.]?\s*(.+?)(?=\n|$)"
            match = re.search(pattern, text, re.IGNORECASE | re.DOTALL)
            if match:
                # 清理捕获值:去首尾空格,合并内部多余空白
                value = re.sub(r'\s+', ' ', match.group(1).strip())
                results[key] = value
                break  # 找到第一个匹配即停止,避免同义词重复覆盖
    return results

# 示例文本(模拟真实多行混排的票据内容)
sample_text = """Company Name GmbH, Teststraße 24 , 01000 Sampleort 
Customer Nr. 11111111 
Invoice Nr. 22222

Invoice Adress Company Name 2 mbH, Test2straße 11, 01001 Sample2ort
Order number. 555555 
Order Date 01.01.1999"""

# 执行提取
extracted = extract_information(sample_text, values_dict)

# 格式化输出(按需求顺序打印)
output_order = ['Company Information', 'Invoice Company Information', 
                'Customer Number', 'Order Number', 'Invoice Number', 'Order Date']
for field in output_order:
    if field in extracted:
        print(f"{field}: {extracted[field]}")

运行结果示例:

Company Information: Company Name GmbH, Teststraße 24 , 01000 Sampleort  
Invoice Company Information: Company Name 2 mbH, Test2straße 11, 01001 Sample2ort  
Customer Number: 11111111  
Order Number: 555555  
Invoice Number: 22222  
Order Date: 01.01.1999

关键优化与注意事项:

  • ✅ re.escape() 防止变体中的特殊字符(如 .、:)被误解析为正则元字符;
  • ✅ re.IGNORECASE | re.DOTALL 确保大小写不敏感,且 . 可匹配换行符(应对跨行场景);
  • ✅ 使用 (?=\n|$) 正向先行断言限制捕获范围,避免过度贪婪;
  • ⚠️ 若值本身含换行(如地址跨多行),需改用更复杂的上下文匹配逻辑(例如基于段落分割预处理);
  • ⚠️ 对高度非结构化文本,建议先做清洗(移除页眉页脚、标准化空格)再提取;
  • ? 可扩展为批量处理:用 glob 读取 .txt 文件列表,循环调用 extract_information 并导出 CSV/JSON。

该方法平衡了灵活性与可维护性——新增字段只需扩展字典,无需重写逻辑,是文本数据清洗与信息抽取任务中的实用范式。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1104

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

2047

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1184

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

8611

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1454

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1505

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

860

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

530

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1087

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.4万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 131.8万人学习