- Python進階編程:編寫更高效、優(yōu)雅的Python代碼
- 劉宇宙 謝東 劉艷
- 990字
- 2021-04-30 12:39:37
2.2.3 字符串清理
在實際工作場合中,我們可能遇到的不只是中文、英文,還會經常遇到一些不熟悉的語言文本,如阿拉伯語、法語等,或是被惡意編纂出來的文本,這就需要對字符串做清理。
文本清理問題涉及包括文本解析與數據處理等一系列問題。在非常簡單的情形下,我們可以選擇使用字符串函數(如str.upper()和str.lower())將文本轉為標準格式,使用str.replace()或者re.sub()函數的替換操作刪除或者改變指定的字符序列。
有時候,我們可能想在清理操作上更進一步,如想消除整個區(qū)間的字符或者變音符,這時可以使用str.translate()方法實現,相關代碼(str_clean.py)示例如下:
test_str = 'pyt???\fis\tawesome\r\n' print(test_str)
首先做空白字符清理,創(chuàng)建一個小的轉換表格,然后使用translate()方法,示例如下:
re_map = {ord('\t') : ' ', ord('\f'): ' ', ord('\r'): None} print(test_str.translate(re_map))
執(zhí)行py文件,輸出結果如下:
pyt??? is awesome
由輸出結果可知,空白字符\t和\f已經被重新映射為一個空格,回車字符r直接被刪除。
以這個表格為基礎進一步構建更大的表格,如刪除所有的和音符,相關代碼(str_clean.py)示例如下:
import unicodedata import sys cmb_chrs = dict.fromkeys(c for c in range(sys.maxunicode) if unicodedata.combining(chr(c))) b_val = unicodedata.normalize('NFD', test_str) print(b_val) print(b_val.translate(cmb_chrs))
執(zhí)行py文件,輸出結果如下:
Pyt??? is awesome Python is awesome
上述示例通過dict.fromkeys()方法構造一個字典,每個Unicode和音符作為鍵,對應的值全部為None。
使用unicodedata.normalize()方法將原始輸入標準化為分解形式字符,再調用translate()方法刪除所有重音符。同樣的技術也可以用來刪除其他類型的字符(比如控制字符等)。
再看一個示例,構造一個將所有Unicode數字字符映射到對應的ASCII字符上的表格:
digit_map = {c: ord('0') + unicodedata.digit(chr(c)) for c in range(sys.maxunicode) if unicodedata.category(chr(c)) == 'Nd' } print(len(digit_map)) x = '\u0661\u0662\u0663' print(x.translate(digit_map))
另一種清理文本的技術涉及I/O解碼與編碼函數。這里的思路是先對文本做一些初步清理,再結合encode()或者decode()方法對其進行清除或修改,代碼示例如下:
test_b = unicodedata.normalize('NFD', test_str) print(test_b.encode('ascii', 'ignore').decode('ascii'))
這里的標準化操作將原來的文本分解為單獨的和音符。接下來的ASCII編碼/解碼只是簡單丟棄那些不需要的字符。這種方法將在獲取文本對應的ACSII編碼表示的時候生效。
字符串清理最主要的問題是運行性能。一般情況下,代碼越簡單運行越快。對于簡單的替換操作,str.replace()方法通常是最快的,甚至在需要多次調用的時候速度也很快。清理空白字符的代碼示例如下:
def clean_spaces(s): s = s.replace('\r', '') s = s.replace('\t', ' ') s = s.replace('\f', ' ') return s
通過測試,我們會發(fā)現str.replace()方法比translate()方法或者正則表達式運行要快很多。如果需要執(zhí)行任何復雜字符對字符的重新映射或者刪除操作,translate()方法也可以,執(zhí)行速度也很快。
對于應用程序來說,性能是不得不去研究的。而且對于性能,我們不能給出特定的方法使它能夠適應所有的情況。因此,在實際應用中我們需要嘗試不同的方法并做對應的評估后,再選擇具體的方案。
- Hyper-V 2016 Best Practices
- C語言程序設計案例教程(第2版)
- Data Analysis with IBM SPSS Statistics
- Spring快速入門
- C語言程序設計簡明教程:Qt實戰(zhàn)
- Fast Data Processing with Spark(Second Edition)
- R數據科學實戰(zhàn):工具詳解與案例分析
- Natural Language Processing with Python Quick Start Guide
- Mockito Essentials
- 大學計算機基礎實驗指導
- Advanced Python Programming
- SFML Game Development
- 產品架構評估原理與方法
- Building Apple Watch Projects
- 數據結構與算法詳解