我經常收到pdftotext在某些任意單詞的字母之間包含(使用 轉換時)空格的PDF :
This i s a n example t e x t that c o n t a i n s strange spaces.
為了進一步自動化處理(查找特定單詞),我想洗掉“獨立”字母(單字母單詞)之間的所有空格,因此結果如下所示:
This isan example text that contains strange spaces.
我試圖用一個簡單的 perl 正則運算式來實作這一點:
s/ (\w) (\w) / $1$2 /g
這當然不起作用,因為在第一個和第二個獨立字母移動到一起后,第二個不再是獨立的,所以第三個的空格將不匹配:
This is a n example te x t that co n ta i ns strange spaces.
所以我嘗試了鎖定斷言,但沒有實作任何東西(也是因為我沒有找到任何在替換中使用它們的例子)。
和 PRE 一樣,我的感覺是,必須有一個非常簡單和優雅的解決方案......
uj5u.com熱心網友回復:
只需匹配一系列由空格分隔的連續單個字母,然后使用嵌套替換(/e eval 修飾符)從中洗掉所有空格。
s{\b ((\w\s) \w) \b}{ my $s = $1; $s =~ s/ //g; $s }xge;
uj5u.com熱心網友回復:
可以使用正則運算式洗掉多余的空格,但 Perl 本身無法知道什么是正確的英語。有了這個警告,這似乎有效:
$ perl -pe's/(?<!\S)(\S) (?=\S )/$1/g' spaces.txt
This isan example text that contains strange spaces.
請注意,i s a n不能與正常的 4 個字母的單詞區分開來,需要人工更正,或某些語言模塊。
解釋:
(?<!\S)否定后視斷言檢查后面的字符不是非空格。(\S)next 必須跟隨一個非空格,我們用括號捕獲它,然后是一個空格,我們將洗掉(或不放回原樣)。(?=\S )接下來,我們檢查一個先行斷言,接下來是一個非空格后跟一個空格。我們不會更改那里的字串。- 然后放回我們捕獲的角色
$1
使用[^ ]代替可能更正確\S。由于您似乎只有插入空格的問題,因此無需匹配制表符、換行符或其他空格。如果您覺得合適,請隨意進行更改。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/385999.html
