【问题标题】:Regex to capture variables with multiple values from columns正则表达式从列中捕获具有多个值的变量
【发布时间】:2016-02-02 18:44:43
【问题描述】:

我需要使用单独的工作流元素来捕获这两个值。 (“Soldto:”正下方的第3行值,与“Shipto:”相同。文本在页面上按列排列,因此将其视为简单模式不起作用。请指教。

图像是真实的,因为文本是通过扫描和 OCR'ing TIF 图像生成的,但这里有一些文本是我为了测试而复制的(比页面上的更简洁)

Soldto:                                 Shipto:                                 Billto:                                 
00011222                                00017872                                10221060                                
COSTCO CO INC. - GLOBAL EDI             COSTCO LANGLEY DEPOT                    COSTCO CO/LANGLEY        

为避免排列这些列所需的所有 HTML 格式,我将示例文本链接为 .txt file.

感谢您的帮助。

【问题讨论】:

  • 顺便说一下,界面是Laserfiche Workflow Pattern Matching。使用正则表达式标识 Soldto: 或 Shipto: 在页面上,然后我需要帮助转到第三行并选择大约 35 个字符、空格和标点符号。
  • 您能否编辑您的问题并将实际的文本放入其中?

标签: regex string text extract ocr


【解决方案1】:

好吧,你实际上并没有展示有问题的编程语言,所以我将在 PHP 中展示一个可能的解决方案:

<?php
$string = 'Soldto:                              Shipto:                                 Billto:                                 
00011222                                00017872                                10221060                                
COSTCO CO INC. - GLOBAL EDI             COSTCO LANGLEY DEPOT                    COSTCO CO/LANGLEY                       ';
$regex = '~               # delimiter
            ^Soldto:      # look for "Soldto:" at the beginning of the string
            (?:.*\R){2}   # match everything up to the end + newline (2 times)
            (?<poi>.*)    # capture the whole third row into the group "poi"
        ~x';

preg_match_all($regex, $string, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
    $columns = preg_split('~\s{2,}~', $match["poi"]);
    # the idea here is to watch out for at least 2 consecutive spaces
    # and use this as delimiter

    print_r($columns);
    /* output
    Array
    (
        [0] => COSTCO CO INC. - GLOBAL EDI
        [1] => COSTCO LANGLEY DEPOT
        [2] => COSTCO CO/LANGLEY
        [3] => 
    )
    */
}
?>

这显然可以根据您的需要进行调整,但是您现在可以在$columns 数组中访问您的数据。

要仅从第一列 (COSTCO CO INC. - GLOBAL EDI) 获取字符串,您可以使用以下正则表达式:

^Soldto:(?:.*\R){2}\K((?:(?!\s{2}).)+)

查看demo here

【讨论】:

  • 感谢您的帮助。编程语言是 C#。我会尽力配合你的建议。程序点:此正则表达式提取第一个条目(“COSTCO CO INC. - GLOBAL EDI”。)Billto:\s*\d+\s*\d+\s+\d+\s+(.{32})
  • 很好,当您发布时,我发现了一种基于第三列顶部条目的方法。这个得到第三行的第二个条目: Billto:\s*\d+\s*\d+\s*\d+\s*(?:.{32})\s*(.{32})跨度>
  • 我喜欢你的正则表达式。它适用于第一列。那么,如何隔离第三行的第二个条目呢?
  • 我正在使用它来捕获它作为一个组,但我不知道如何使整个第一个结果不被捕获。 ^Soldto:(?:.*\R){2}\K((?:(?!\s{2}).)+)\K\s*\K((?:(?!\s{2}).)+)查看您编辑的demo here.
【解决方案2】:

好的,所以我发现了一些关于 Laserfiche 的信息。
1.不使用\R和\K命令,所以PHP代码不起作用。
2. 它不会将 OCR 结果保存在列中,因此不需要通过列进行解析,虽然超级酷,但没有必要。

以下是部分文字:
品牌:制作时间:10:03:09
索托:
00011222
COSTCO CO INC. - 全球 EDI
西澳,
发货方:
00010377
COSTCO/TRACY #179
25862 S 舒尔特
特雷西,加利福尼亚州,95376

以下是完成这项工作的正则表达式:
一个。卖给:So[lit1I|]dto:(?:\s+\d+\s+)(.+)
湾。发货人:Sh[lit1I|]pto:(?:\s+\d+\s+)(.+)

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2022-11-18
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多