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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

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

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

審查清理文本字符串

問題

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

解法

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

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

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

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

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

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


你可以以這個(gè)表格為基礎(chǔ)進(jìn)一步構(gòu)建更大的表格。比如,讓我們刪除所有的和音符:

>>> 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() 方法構(gòu)造一個(gè)字典,每個(gè) Unicode 和音符作為鍵,對(duì)于的值全部為 None 。

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


作為另一個(gè)例子,這里構(gòu)造一個(gè)將所有 Unicode 數(shù)字字符映射到對(duì)應(yīng)的 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' >>>

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

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

這里的標(biāo)準(zhǔn)化操作將原來的文本分解為單獨(dú)的和音符。接下來的 ASCII 編碼/解碼只是簡(jiǎn)單的一下子丟棄掉那些字符。當(dāng)然,這種方法僅僅只在最后的目標(biāo)就是獲取到文本對(duì)應(yīng) ACSII 表示的時(shí)候生效。

討論

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

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

如果你去測(cè)試的話,你就會(huì)發(fā)現(xiàn)這種方式會(huì)比使用 translate() 或者正則表達(dá)式要快很多。

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

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

盡管本文中討論的是文本,但是類似的技術(shù)也可以適用于字節(jié),包括簡(jiǎn)單的替換,轉(zhuǎn)換和正則表達(dá)式。

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。