消除单个字母周围的空格
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
可能更正确。由于您似乎只是在插入空格时遇到问题,因此无需匹配制表符、换行符或其他空格。如果您觉得合适,请随意进行更改。
我经常收到 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
可能更正确。由于您似乎只是在插入空格时遇到问题,因此无需匹配制表符、换行符或其他空格。如果您觉得合适,请随意进行更改。