官术网_书友最值得收藏!

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í)行速度也很快。

對于應用程序來說,性能是不得不去研究的。而且對于性能,我們不能給出特定的方法使它能夠適應所有的情況。因此,在實際應用中我們需要嘗試不同的方法并做對應的評估后,再選擇具體的方案。

主站蜘蛛池模板: 定陶县| 高唐县| 泾阳县| 逊克县| 兴仁县| 西昌市| 郎溪县| 自治县| 江西省| 女性| 马龙县| 图们市| 通许县| 陆丰市| 雅安市| 胶南市| 文化| 八宿县| 三河市| 西乡县| 安溪县| 乐都县| 马公市| 西林县| 灌南县| 南雄市| 会宁县| 卢龙县| 安溪县| 连江县| 枣阳市| 沐川县| 清远市| 德格县| 高碑店市| 浦江县| 额济纳旗| 金门县| 西乌| 扶沟县| 新闻|