消除单个字母周围的空格

Eliminate whitespace around single letters

我经常收到 PDF,其中包含(当使用 pdftotext 转换时)在某些任意单词的字母之间包含白色space:

This i s a n example t e x t that c o n t a i n s strange spaces.

为了进一步的自动化处理(寻找特定的词)我想删除“独立”字母(单字母词)之间的所有白色space,所以结果看起来像这样:

This isan example text that contains strange spaces.

我试图用一个简单的 perl 正则表达式来实现:

s/ (\w) (\w) / /g

这当然不行,因为在第一个和第二个独立字母移动到一起后,第二个不再是独立字母,所以 space 到第三个将不匹配:

This is a n example te x t that co n ta i ns strange spaces.

所以我尝试了提前锁定断言,但没有取得任何成果(也是因为我没有找到任何在替换中使用它们的示例)。

与 PRE 一样,我的感觉是,必须有一个非常简单和优雅的解决方案...

只需匹配一系列由空格分隔的连续单个字母,然后使用嵌套替换(/e eval 修饰符)从中删除所有空格。

s{\b ((\w\s)+\w) \b}{ my $s = ; $s =~ s/ //g; $s }xge;

可以使用正则表达式删除多余的空格,但 Perl 本身无法知道什么是正确的英语。有了这个警告,这似乎有效:

$ perl -pe's/(?<!\S)(\S) (?=\S )//g' spaces.txt
This isan example text that contains strange spaces.

请注意,i s a n 无法与普通的 4 字母单词区分开来,需要人工更正或某些语言模块。

解释:

  • (?<!\S) 否定后视断言检查后面的字符不是非空白字符。
  • (\S) 接下来必须跟一个非空格,我们用括号捕获它,然后是一个空格,我们将删除它(或者不放回原来的样子)。
  • (?=\S ) 接下来我们用前瞻性断言检查后面是一个非空白后面跟着一个空白。我们不更改那里的字符串。
  • 然后把我们用</code></li>捕获的字符放回去 </ul> <p>使用 <code>[^ ] 代替 \S 可能更正确。由于您似乎只是在插入空格时遇到问题,因此无需匹配制表符、换行符或其他空格。如果您觉得合适,请随意进行更改。