2017-05-05 127 views
0

我已經在ubuntu中使用pdftotext -raw /path/to/pdf.pdf /path/to/output.txt將pdf文檔轉換爲文件。我使用sample = open("/path/to/output.txt").read()讀取轉換後的文件。現在示例有未解碼的Unicode字符串,如\xe2\x80\x99。我想使用正則表達式替換它們''。我使用的模式re.sub(r"""\\\\"""," ",sample),re.sub(r'\\x..',"",sample),re.sub(r'\\\\x..'," ",sample)使用re替代unicode字符串

例如藉此

abc="[email protected]\n\x0c" 
re.sub(r'\\x..',"",abc) 
re.sub(r'\\\\x..'," ",abc) 
abc.encode("ascii","ignore") 

我評價\\x..模式using this online regex tester選擇語言蟒蛇also thisthis SO Question's answer使用基於參考\\\\x..模式,但兩者給我[email protected]\n\x0c作爲輸出。它不會刪除這些unicode字符串。我不想使用模式\\\w..,因爲它可能會選擇轉義序列。即使我嘗試過輸入UnicodeDecodeError的abc.encode('utf8')。我明白這個問題是因爲\x??正在被讀爲字符串,但我不知道如何解決這個問題。

如果你想在解決方案進行測試,請使用這些:

182\nWheel of Life, 24\xe2\x80\x9325, 135\xe2\x80\x93136 
\n194\xe2\x80\x93195 
CTI\xe2\x80\x99s\ntraining enables participants 
80\xe2\x80\x9383 

這些測試串的預期輸出應該是

182\nWheel of Life, 2425, 135136 
\n194195 
CTIs\ntraining enables participants 
8083 

注:

我ve也試過

abc=abc.decode("utf-8") 
abc=abc.encode("ascii","ignore") 

這個刪除某些字符,但我仍然可以看到一些字符串像\x0c這是所以我只想正則表達式的方式來替換這些字符串。

嘗試正則表達式:

abc="[email protected]\x0c\xc0ecoaches.com\n\x0c" #input 

re.sub(r'[\\x[a-fA-F0-7]-\\x[a-fA-F0-7]]+',' ',abc) 
re.sub(r'[^\x00-\x7F]+',' ',abc) 
re.sub(r'\\x..',"",abc) 
re.sub(r'\\\\x..'," ",abc) 

請加原因downvoting。因爲它會幫助我理解我的錯誤。問題可能很簡單,但需要解決方案。我在這裏張貼之前已經做了很多的研究及嘗試,我希望人們「LL值它們

回答

0

實測值的固定的字符範圍從\x00-\x7f包括在鍵盤中的所有字符,因此re.sub(r'[^\x00-\x7f]+','', abc)替換每個字符和結果是''

非可打印字符如\f\v被python解釋器識別爲\x0c\x0b,其中,其他非打印字符被識別爲例如:\n\r\b被識別爲\n\r\b。因此,爲了僅更換\x0c\x0b\f\v到但跳過正則表達式將是re.sub(r'[\x0b-\x0c]','',(re.sub(r'[^\x00-\x7f]+','', abc)))re.sub(r'[^\x00-\x7f]+','', abc).replace("\f","").replace("\v","")也適用

正則表達式替換從替換字符串和其他不可打印的字符\x0b,\x0c被保留其他轉義序列和字符。這也是由str.replace()\f and \v

只有這兩個字符在python識別方面不同,因爲只有這些字符組合了其他兩個轉義序列的功能。

實施例:

\f ==> \n+\r 
\v ==> \n+\t