日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

《Python Cookbook 3rd》笔记(2.12):审查清理文本字符串

發布時間:2023/12/13 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《Python Cookbook 3rd》笔记(2.12):审查清理文本字符串 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

審查清理文本字符串

問題

一些無聊的幼稚黑客將你的網站頁面中的“python”改成“pyt???”,然后你想將這些字符清理掉。

解法

文本清理問題會涉及到包括文本解析與數據處理等一系列問題。在非常簡單的情形下,你可能會選擇使用字符串函數 (比如 str.upper() 和 str.lower() ) 將文本轉為標準格式。使用 str.replace() 或者 re.sub() 的簡單替換操作能刪除或者改變指定的字符序列。你同樣還可以使用 2.9 小節的 unicodedata.normalize() 函數將 unicode文本標準化。

然后,有時候你可能還想在清理操作上更進一步。比如,你可能想消除整個區間上的字符或者去除變音符。為了這樣做,你可以使用經常會被忽視的 str.translate()方法。為了演示,假設你現在有下面這個凌亂的字符串:

>>> s = 'pyt???\fis\tawesome\r\n' >>> s 'pyt???\x0cis\tawesome\r\n' >>>

第一步是清理空白字符。為了這樣做,先創建一個小的轉換表格然后使用translate() 方法:

>>> remap = { ... ord('\t') : ' ', ... ord('\f') : ' ', ... ord('\r') : None # Deleted ... } >>> a = s.translate(remap) >>> a 'pyt??? is awesome\n' >>>

正如你看的那樣,空白字符 nt 和 nf 已經被重新映射到一個空格。回車字符 r 直接被刪除。


你可以以這個表格為基礎進一步構建更大的表格。比如,讓我們刪除所有的和音符:

>>> import unicodedata >>> import sys >>> cmb_chrs = dict.fromkeys(c for c in range(sys.maxunicode) ... if unicodedata.combining(chr(c))) ... >>> b = unicodedata.normalize('NFD', a) >>> b 'pyt??? is awesome\n' >>> b.translate(cmb_chrs) 'python is awesome\n' >>>

上面例子中,通過使用 dict.fromkeys() 方法構造一個字典,每個 Unicode 和音符作為鍵,對于的值全部為 None 。

然后使用 unicodedata.normalize() 將原始輸入標準化為分解形式字符。然后再調用 translate 函數刪除所有重音符。同樣的技術也可以被用來刪除其他類型的字符
(比如控制字符等)。


作為另一個例子,這里構造一個將所有 Unicode 數字字符映射到對應的 ASCII 字符上的表格:

>>> digitmap = { c: ord('0') + unicodedata.digit(chr(c)) ... for c in range(sys.maxunicode) ... if unicodedata.category(chr(c)) == 'Nd' } ... >>> len(digitmap) 460 >>> # Arabic digits >>> x = '\u0661\u0662\u0663' >>> x.translate(digitmap) '123' >>>

另一種清理文本的技術涉及到 I/O 解碼與編碼函數。這里的思路是先對文本做一
些初步的清理,然后再結合 encode() 或者 decode() 操作來清除或修改它。比如:

>>> a 'pyt??? is awesome\n' >>> b = unicodedata.normalize('NFD', a) >>> b.encode('ascii', 'ignore').decode('ascii') 'python is awesome\n' >>>

這里的標準化操作將原來的文本分解為單獨的和音符。接下來的 ASCII 編碼/解碼只是簡單的一下子丟棄掉那些字符。當然,這種方法僅僅只在最后的目標就是獲取到文本對應 ACSII 表示的時候生效。

討論

文本字符清理一個最主要的問題應該是運行的性能。一般來講,代碼越簡單運行越快。對于簡單的替換操作, str.replace() 方法通常是最快的,甚至在你需要多次調用的時候。比如,為了清理空白字符,你可以這樣做:

def clean_spaces(s):s = s.replace('\r', '')s = s.replace('\t', ' ')s = s.replace('\f', ' ')return s

如果你去測試的話,你就會發現這種方式會比使用 translate() 或者正則表達式要快很多。

另一方面,如果你需要執行任何復雜字符對字符的重新映射或者刪除操作的話,tanslate() 方法會非常的快。

從大的方面來講,對于你的應用程序來說性能是你不得不去自己研究的東西。不幸的是,我們不可能給你建議一個特定的技術,使它能夠適應所有的情況。因此實際情況中需要你自己去嘗試不同的方法并評估它。

盡管本文中討論的是文本,但是類似的技術也可以適用于字節,包括簡單的替換,轉換和正則表達式。

總結

以上是生活随笔為你收集整理的《Python Cookbook 3rd》笔记(2.12):审查清理文本字符串的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。