【问题标题】:Regex query: how can I search PDFs for a phrase where words in that phrase appear on more than one line?正则表达式查询:如何在 PDF 中搜索该短语中的单词出现在多行的短语?
【发布时间】:2010-05-07 14:10:08
【问题描述】:

我正在尝试为我所从事的周刊设置索引页。是为了向读者展示他们的名字 在那几周的问题中提到的公司,以及它们出现的页码。

我想搜索本周的所有 PDF 文件,其中一个 PDF = 一个杂志页面(最初制作于 Adobe InDesign CS3 和 Adob​​e InCopy CS3)。

我已经设置了我要搜索的公司列表,并使用 PowerGREP 和分隔正则 表达,我能够找到提到公司的大多数页码。 但是,如果 公司名称包含两个或多个单词,我正在运行的搜索不会找到 name 出现在不止一行上。

例如,在查找“CB Richard Ellis”和“Cushman & Wakefield”时,当 文字看起来像这样:

DTZ 击败 BNP PRE、CB [此处换行]

Richard Ellis 和 Cushman & [此处换行]

Wakefield 确保合同。 [此处结束]

有人可以告诉我如何编写一个忽略空格之间的正则表达式 单词并忽略行尾或查找包含所有类型空格的单词(即不均匀 单词之间的空格;行尾或行尾的空格;和标签(我猜这个信息是 以某种方式嵌入 PDF 文件中)。

这是我要求 PowerGREP 搜索的一组术语的示例:

\bCB Richard Ellis\b
\bCB Richard Ellis Hotels\b
\bCentaur Services\b
\bChapman Herbert\b
\bCharities Property Fund\b
\bChetwoods Architects\b
\bChurch Commissioners\b
\bClive Emson\b
\bClothworkers’ Company\b
\bColliers CRE\b
\bCombined English Stores Group\b
\bCommercial Estates Group\b
\bConnells\b
\bCooke & Powell\b 
\bCordea Savills\b
\bCrown Estate\b
\bCushman & Wakefield\b
\bCWM Retail Property Advisors\b

[请注意,每个短语末尾的每个 \b 和下一个短语的开头之间都有一个分隔的硬回车。]

顺便说一句,我是一名制作记者,通常不参与寻找 IT 类型的解决方案,我 发现很难掌握 PowerGREP 网站上的技术语言。

感谢您的帮助

艾莉森

【问题讨论】:

    标签: regex


    【解决方案1】:

    您的姓名中有硬编码空格。将它们替换为 \s+ 应该没问题。

    例如:

    CB\s+Richard\s+Ellis
    

    发生的情况是,当您强制换行时,它不再有那个空格(“”)字符。相反,它有\n\r\n。使用\s+ 意味着您正在查找任何数量为一个或多个的空白字符,包括回车符和换行符。

    【讨论】:

    • 感谢两位的回答。它们是有道理的,但不幸的是,这两个建议都不起作用——搜索仍然没有找到我上面使用的示例中的短语。我很茫然……您还有其他想法吗?我检查了原始文档(InDesign CS3),单词之间只有一个空格——它们出现在不同的行上。这在 PDF 上显示为多个空格,因为文本没有对齐,而是简单地向左排列,这导致文本列的右侧边缘参差不齐。我想知道这是否是我可以在正则表达式中包含的其他内容的线索?
    • @Alison:好的,我对此进行了检查,它似乎是一个 PDF 以二进制代码存储文本,不像您认为您正在寻找的字符串那样可读。 PowerGREP 应该能够找到与您在上面显示的字符串类似的字符串,它通过将文本的内部表示创建为普通字符串来实现,所以如果它不起作用,我只能想象从 InDesign 转换 PDF 的过程可能有将文本转换为矢量图形或其他。检查您的 PDF 转换器上的设置,看看它是否是这样的。很抱歉没有其他要补充的。
    • grep 传统上是基于行的活动。我确定 PowerGREP 可以 找到跨越多行的匹配项,但默认情况下会这样做吗?我会寻找一个选项来启用它。
    【解决方案2】:

    匹配空格的正则表达式是\s,所以应该是

    \bCB\s+Richard\s+Ellis\b
    

    (\s+ = 至少匹配一个空格)。换行符是\n(换行符)和\r(回车符),具体取决于您的操作系统。因此使用[] 组成一个组,包括所有[\r\n\s] 将导致:

    \bCB[\r\n\s]+Richard[\r\n\s]+Ellis\b
    

    【讨论】:

    • 感谢两位的回答。它们是有道理的,但不幸的是,这两个建议都不起作用——搜索仍然没有找到我上面使用的示例中的短语。我很茫然……您还有其他想法吗?我检查了原始文档(InDesign CS3),单词之间只有一个空格——它们出现在不同的行上。这在 PDF 上显示为多个空格,因为文本没有对齐,而是简单地向左排列,这导致文本列的右侧边缘参差不齐。我想知道这是否是我可以在正则表达式中包含的其他内容的线索?
    • \s 已经匹配 \r\n;您不必单独列出它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    相关资源
    最近更新 更多