2014年1月20日 星期一

正則表達式取代字元,擷取想要的內容

網頁中有些標籤內容看似很複雜又很有規律,如何快速擷取?

(以下敘述均針對Google Spreadsheet環境下操作)
底下這些內容是撈取自網頁 <script> 標籤的內容,想要快速的分解出  臺北地區、桃園地區..等字串,就需要借助正則表達式來作取代分解的動作,下面的說明會運用到的函數有REGEXREPLACESPLIT、TRANSPOSE,請將下面的內容copy到儲存格A1

"TRCity.push('0');TRCity.push('臺北地區');TRCity.push('Taipei');TRCity.push('1');TRCity.push('桃園地區');TRCity.push('Taoyuan');TRCity.push('2');TRCity.push('新竹地區');TRCity.push('Hsinchu 
');TRCity.push('3');TRCity.push('苗栗地區');TRCity.push('Miaoli 
');TRCity.push('4');TRCity.push('臺中地區');TRCity.push('Taichung 
');TRCity.push('5');TRCity.push('彰化地區');TRCity.push('Changhua 
');TRCity.push('6');TRCity.push('南投地區');TRCity.push('Nantou');TRCity.push('7');TRCity.push('雲林地區');TRCity.push('Yunlin');TRCity.push('8');TRCity.push('嘉義地區');TRCity.push('Chiayi 
');TRCity.push('9');TRCity.push('臺南地區');TRCity.push('Tainan');TRCity.push('10');TRCity.push('高雄地區');TRCity.push('Kaohsiung');TRCity.push('11');TRCity.push('屏東地區');TRCity.push('Pingtung 
');TRCity.push('12');TRCity.push('臺東地區');TRCity.push('Taitung');TRCity.push('13');TRCity.push('花蓮地區');TRCity.push('Hualien 
');TRCity.push('14');TRCity.push('宜蘭地區');TRCity.push('Yilan 
');TRCity.push('15');TRCity.push('平溪線');TRCity.push('Pinghsi 
Line');TRCity.push('16');TRCity.push('內灣/六家線');TRCity.push('Neiwan / Liujia 
Line');TRCity.push('17');TRCity.push('集集線');TRCity.push('Jiji 
Line');TRCity.push('18');TRCity.push('沙崙線');TRCity.push('Shalun 
Line');TRCity.push('19');TRCity.push('深澳線');TRCity.push('ShenAo Line');"

請在A2儲存格輸入  =REGEXREPLACE($A$1,"[A-Za-z.()'\s地區]","")
結果如下

0;臺北;;1;桃園;;2;新竹;;3;苗栗;;4;臺中;;5;彰化;;6;南投;;7;雲林;;8;嘉義;;9;臺南;;10;高雄;;11;屏東;;12;臺東;;13;花蓮;;14;宜蘭;;15;平溪線;;16;內灣/六家線;/;17;集集線;;18;沙崙線;;19;深澳線;;

說明:
一、
REGEXREPLACE(被取代的字串,正則表達式,要變成的字串)
這是用正則表達式挑選出來的字元集合來取代字串的函數

簡單說明一下正則表達式 "[A-Za-z.()'\s地區]" 的功用
正則表達式需要用 [  ] 包起來,
字串中只要 有英文字母A-Z(不管大小寫)、. 號、' 號、()號、任何型式的空白字元(\s)、地區 字眼,都要挑出來,並且用第三個參數 "" 空白來取代

更深入的正則表達式說明請善用網路搜尋學習

PS:在這個例子中沒有取代掉阿拉伯數字0-9,是因為這是地區代碼,所以保留了起來

二、
仔細觀察一下上面輸出的結果,"/"這個符號其實是沒作用的,我們的重點是地區代號(阿拉伯數字),所以在 A2的儲存格 公式就替換為 
=REGEXREPLACE($A$1,"[A-Za-z.()'/\s地區]","")

結果如下

0;臺北;;1;桃園;;2;新竹;;3;苗栗;;4;臺中;;5;彰化;;6;南投;;7;雲林;;8;嘉義;;9;臺南;;10;高雄;;11;屏東;;12;臺東;;13;花蓮;;14;宜蘭;;15;平溪線;;16;內灣六家線;;17;集集線;;18;沙崙線;;19;深澳線;;

三、使用SPLIT(字串,分割字串,[TRUE])
由資料內容來看,0;臺北;;是一組DATA,1;桃園;;又是一組DATA,表示我們如果要分離字串,他的分割字串就是 ;;
所以,請在 A3儲存格輸入公式 =SPLIT($A$2,";;")
然而當我們輸入這樣的公式時,會大失失望,因為工作表這個公式的第三個參數默認值是TRUE,會把所有帶有 ; (不管是幾個連續的 ; 號)都視為分割字元,所以要修正成

=SPLIT($A$2,";;",FALSE)
表示我們要分割的字串組是要 確實的二個 ; 號

分離的結果是橫向排列

一般運用上,我們不希望橫向放分離過後的字串陣列(系統可運用的Column數比ROW數少,放資料筆數容易受到限制),所以運用TRANSPOSE(字串陣列)來轉置(橫轉直,直轉橫)改變方向

所以在 A5 儲存格 我們做個對照組,輸入公式 = TRANSPOSE(SPLIT($A$2,";;",FALSE))
可以看到不一樣的顯示結果
 

<本章節結束>

沒有留言:

張貼留言