天天看點

《Clojure資料分析秘笈》——2.2節使用正規表達式清洗資料

本節書摘來自華章社群《clojure資料分析秘笈》一書中的第2章,第2.2節使用正規表達式清洗資料,作者(美)eric rochester,更多章節内容可以通路雲栖社群“華章社群”公衆号檢視

2.2 使用正規表達式清洗資料

大概最基本、最普遍的資料清洗方式就是正規表達式了。盡管有時被濫用,但是很多時候正規表達式是完成一項工作最适合的工具。而且,clojure内置編譯正規表達式的文法,是以在clojure中使用正規表達式也很友善。

本例将編寫一個标準化美國電話号碼的函數。

2.2.1 準備工作

本方法需要在腳本或repl中使用clojure.string庫。表達式如下:

《Clojure資料分析秘笈》——2.2節使用正規表達式清洗資料

2.2.3 實作原理

本方法中最複雜的部分是正規表達式,接下來對其詳細講解。

(?x):這是本身并不比對任何内容的辨別符。它允許展開正規表達式,并且它會忽略空格和注釋。以這種方式編寫正規表達式使它們具有相當好的可讀性和可用性,特别是6個月後當你試圖回憶它的作用時。

(d{3}):比對三個數字。

d{0,2}:比對0~2個非數字字元。這是為了允許在區号和字首之間存在可選的分隔符。

(d{3}):比對另外三個數字。

d?:這是一個可選的非數字字元。例如,允許一個破折号。

(d{4}):這是電話号碼的最後4位數字。

圓括号中間的内容可以被正規表達式比對。如果正規表達式的圓括号中沒有組(groups),re-find僅傳回比對的字元串。如果有組,将傳回一個向量。比對的整個字元串是向量的第一個元素,正規表達式中組的内容存在于向量後面的元素中。本方法使用傳回的組來建構輸出。

2.2.4 更多資訊

正規表達式很複雜,而且很多書對其做了介紹。這裡有更多關于正規表達式的資源:

2.2.5 參閱

jamie zawinski曾說過:

有一些人,當他們遇到難題的時候,會想“我知道,我将使用正規表達式”。然後他們就會有兩個難題。

正規表達式是一個複雜的、愚鈍的工具,而且通常需要精心設計。有時它們是合适的工具,但有時不是。2.11節将介紹一個更強大、更好用的工具。