《Using OpenRefine》翻譯~17

上一篇:《Using OpenRefine》翻譯~16


第五章:正則表達式和GREL

OpenRefine中有兩個很強大的工具: regular expressions(正則表達式) 和 GREL. Regular expressions 是我們在處理大量數據時用來匹配和替換文本的有效工具。General Refine Expression Language, GREL, 是當需要進行數據特別處理時預定於函數。這一章我們將介紹這兩個工具。

 

 

對文本應用正則表達式

OpenRefne 提供了很多查找所需數據的方法。但是如果你並不知道確切的文本,或者是大數據集中模糊的要求,又或者是單元格間有微小的差別該怎麼辦呢?因爲單是查找一個字母a是比較簡單,但是查找那些包含一個數字(更差的情況是,一個字母后面跟一個數字)的值就困難的多了。這時候正則表達式就該登場了。

正則表達式能夠定義一個文本樣式,而不需要指定一系列精確的文本集。這可以讓你做到指定比如“一個字母后面跟一個數字”及更復雜的東西。正則表達式通過建立一些字符集,這些字符集可以代表你需要查找的內容,與數量符,錨符,可選符組符配合使用就可以滿足你的查找需求。

OpenRefne中使用正則表達式十分簡單。對任何列進行一次文本過濾(Powerhouse Museum數據集中的Object Title 列就特別有趣),通過點擊Object Title 列下拉菜單中的Text filter執行.在新創建的過濾窗口中勾選regular expression (正則表達式)選項。現在數據就可以按照你書寫的表達式進行過濾:

字符集

正則表達式使用字符集(字母,數字,空格等)來查找字符。比如,如果你要查找字母或者數字,你可以直接輸入:

• 使用Aar來查找,那麼就會查找所有文本,其中文本中包含一個大寫A後面跟小寫的a和r。如果區別大小寫選項case sensitive未被勾選,那麼查找就不會區別大小寫。

• 使用123來查找,那麼將查找所有文本,其中包含這些數字。記得41235同樣也會被查找到,因爲123同樣是其的一部分。

• 上面的內容,我們發現就是一般的文本匹配。但是如果使用正則表達式,那麼我們就可以指定那個任何的字母或數字。我們可以使用方括號[ ]來指定一系列的待選字符集。我們還可以在方括號內使用 - 來指定字符域範圍

• [0123456789]匹配其中任何一個數字。

• [0-9]和上面是一個意思,只不過這個更加緊湊。意思是0-9之間的數字都可以。

• 同樣的,[a-z]匹配了所有小寫字母(如果區別大小寫選項未勾選,則大寫字母也會被匹配)。[A-Z]匹配了所有大寫字母。[a-zA-Z]匹配了所有字母,無論大小寫。

• 如果你想匹配字母和數字,可以使用[0-9a-zA-Z]。代表某個字符,可以是0-9之間的任何數字,可以是a-z之間的任何字母,也可以是A-Z之間的任何字母。

• 早些介紹的例子中,我們可以把所有的可能匹配項放在一起,如analy[sz]e將匹配美式拼寫(analyze)和英式拼寫(analyse)。

• 同理,[0-9][a-z]代表一個數字後面跟至少一個小寫字母。[a-z][0-9][0-9][0-9]代表一個字母后面跟至少三個數字。

• 如果你想匹配到如1 cm 或25 in,那麼使用上面的辦法將無法匹配到,因爲中間有個空格。幸運的是,空格也是一個字符,所以可以使用[0-9]  [a-z] 。記得兩個方括號之間有一個空格,並且這個匹配也能匹配到如12345 meters之類的長字符。事實上,其匹配了所有一個數字後面跟一個空格,然後再跟一個字母的樣式。12345 meters其實匹配到了5 m。其餘數字或者字母其實並沒有多大關係。

• 如果你想查找所有以inches爲單位的內容,那麼可以使用[0-9] in。

• 每次都寫[0-9]可能比較麻煩。所以我們可以用到簡化字符集。它們是一些代替字符集的符號。比如,\d代表任何數字,其實就是等同於[0-9],書寫更加簡便。\D代表非數字,可以是字母或者其他字符。不幸的是,沒有代表任何字母的簡化字符集,但是有一個代表任何字母、數字或下劃線的字符集:\w,其代表一個任何字符。相反的是,\W代表一個字符,其不是字母、數字或下劃線。

• \d[a-z]代表任何一個數字後面跟一個小寫字母。

• \d\d\d代表至少有3個連續數字

• \D\D代表至少有2個連續非數字。如果你看到匹配項中也有數字可能會感到奇怪,其實原因是:其只保證匹配到的項中至少有2個連續非數字,但是並不表示一定不包括數字。當然,如果文本內容中只有數字,那麼就不會被匹配到。其實這個表達式代表的意思是:“我在查找至少有2個連續非數字的內容,有嗎?”

• 你可能想知道\D如何工作的。是不是其需要查找所有不包含數字的字符。其實答案很簡單,其在括號中第一個字符前使用^,代表括號中的字符不得出現,所以\D其實就是[^0-9]。

• [^a-zA-Z0-9] 代表不是字母且不是數字。很多字符會被匹配到,比如連續的空格和標點符號。但是,空值是不會被匹配的,因爲這裏至少需要一個字符,且這個字符不是字母和數字。

• [^a-zA-Z0-9]\d[^a-zA-Z0-9]代表任何一個數字,且其前後都有一個字符,這個字符不是字母及數字。舉個例子,圓括號中單個數字(3)會被匹配到,而如(123)不會。因爲這個表達式表示的就是需要單個數字。

如果你確實想匹配任意一個字符,那麼可以使用點“.”,這個字符匹配任何字符(除了換行符\n)。當然單個使用並沒有多大用處,但是和其他字符集配合使用的話就十分有用了。

• a.a.a將匹配到至少連續出現三次字母a,並且兩個a之間有一個任意字符,比如,dulcamara, alabaster, salamander都會被匹配到。

• 19.. (其前後各有一個空格)將匹配到所有20世紀的年份。

• 但是,使用點還是需要慎重:19.. 同樣也會匹配19th和19M$。因爲點代表任何字符,所以如果你想代表年份的話,19\d\d會更加精確。

現在,你可能想知道如何匹配到一個真實的點、方括號或者真實的反斜槓加字母d。辦法是告訴正則表達式你不想使這些字符代表特殊意義。對於字母、數字、空格及一些其他字符,一般不會產生歧義,但是對於有特殊含義的字符,可以在前面再加上反斜槓,點可以表示爲\.。反斜槓可以表示爲\\。

• 可以使用\.\.\.表示三個連續的點(當然還有更高效的辦法,我們將在下節介紹)

• 可以使用\\來匹配反斜槓\。(本數據集中沒有這種情況)

• 可以使用[\[\]]來匹配文本包含左方括號[或者右方括號]。這看起來比較複雜,但其實還是很容易理解的:最先的左方括號和最後的右方括號代表“任意此放括號中內容將匹配”。但是此方括號內的內容爲真實的左右方括號,所以需要特別指定,使用\[ 和 \]。

• [2]代表匹配數字2(方括號內的任意內容被匹配,這裏只有2)。使用\[2\]將匹配真實的2,且前後分別有一個左方括號和右方括號(“[2]”)。因爲這次被特別解釋了,所以方括號也就失去了其特殊的意義。

 

 

 

 

 

 

數量符

到現在爲止,我們介紹了正則表達式中單個字符的表示。但是,我們可能會遇到需要匹配一個未知字符多次的情況。比如,我們如何表示“單引號裏面一個數字”,我們可能會使用’\d’,但是這隻會包括類似於0,1,5之類的單位數數字,多位數數字如23和478將不會被匹配。因爲,計算機解釋’\d’就是:一個單引號,一個數字,再一個單引號。

數量符能夠用來表示重複。有三種簡單的數量符:加號+,代表重複1次及以上;星號*,代表重複0次及以上;問號?,代表重複0次或1次;它們只是針對直接的左側字符起作用。

• bre+d匹配了bred, breed, 或 breeed等任何數量的e,只要e起碼出現1次。

• bre*d匹配了brd,bred, breed, 或 breeed等任何數量的e,可以看到沒有e也會被匹配,記住brd會被星號匹配,但是加號則不會被匹配。

• 我們可以組合使用,br?e+d匹配了bed, bred, beed, breed,beeed, breeed等等。

• 另外,你可以使用花括號{最小值,最大值}來表示字符的重複區間。你可以確定重複的最大值和最小值。其中任何一個可以爲空,如果沒有最小值或者最大值。但是你必須將逗號保留,以保證OpenRefine能知道是最小值還是最大值。如果你僅僅輸入一個數字但是沒有逗號,那麼將僅僅匹配這個數字的重複次數。

• N\d{5,8},將匹配字母N開頭,後面跟5位或6位或7位或8位數字,然後是一個逗號。

• N\d{5,},將匹配字母N開頭,後面跟5位或5位以上數字,然後是一個逗號。

• N\d{,8},將匹配字母N開頭,後面跟最多8位數字,然後是一個逗號。

• N\d{5},將匹配字母N開頭,後面跟5位數字,然後是一個逗號。這等同於N\d\d\d\d\d,但是書寫更加簡潔(特別是數字位數多的情況)。

• 還有一點需要明確,數量符和括號是特殊字符,所以如果你只是想匹配這些字符,那麼你就需要在其前面加上反斜槓。比如,將問好?作爲字符的話可以輸入\?

未完待續... ...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章