天天看點

Matlab-------regexp正規表達式

句點符号 '.' ——比對任意一個(隻有一個)字元(包括空格)。

例如:t.n,它比對tan、 ten、tin和ton,還比對t#n、tpn甚至t n,還有其他許多無意義的組合。

Matlab例子程式:

clear;clc

str='ten,&8yn2tin6ui>&ton, t n,-356tpn,

t#n,4@).,t@nT&nY';

pat='t.n';

[o11,o22,o33]=regexpi(str,pat,'start','end','match');%輸出起始位置和子串

方括号符号 '[oum]' ——比對方括号中的任意一個

例如:t[aeio]n隻比對tan,Ten,tin和toN等。

方括号中的連接配接符 '[c1-c2]' ——比對從字元c1開始到字元c2結束的字母序列

5 \w,\s和\d——類表達式

和上面的\n等表中的轉義字元有所不同,\w,\s,\d等比對的不是某個特定的字元,而是某一類字元。具體說明如下:

\w比對任意的單個文字字元,相當于[a-zA-Z0-9_];

\s比對任意的單個空白字元,相當于[\t\f\n\r];

\d比對任意單個數字,相當于[0-9];

\S比對除空白符以外的任意單個字元,相當于[^\t\f\n\r]——方括号中的^表示取反;

\W比對任意單個字元,相當于[^a-zA-Z0-9_];

\D比對除數字字元外的任意單個字元,相當于[^0-9]。

expr? 與expr比對的元素出現0或1次,相當于{0,1}

expr* 與expr比對的元素出現1次或更多,相當于{0,}

expr+ 與expr比對的元素出現1次或更多,相當于{1,}

expr{n} 與expr比對的元素出現n次,相當于{n,n}

expr{n,} 與expr比對的元素至少出現n次

expr{n,m} 與expr比對的元素出現n次但不多于m次

regexp(str,'<.*?>','match')

regexp(str,'<.*>','match')

邏輯運算符

(expr) 将expr标記為一組、比對expr,并将比對的字元子串标記起來以供後面使用。

(?:expr) 說明expr為一組,相當于數學表達式中的()

例如:?lstr='A body or collection of such stories';

?regexp(lstr,'(?:[^aeiou][aeiou]){2,}','match')

ans =

'tori'

上面的表達式中{2,}對[^aeiou][aeiou]起作用,如果去掉分組,則隻對[aeiou]起作用,如下所示:

?regexp(lstr,'[^aeiou][aeiou]{2,}','match')

'tio' 'rie'

(?>expr) expr中的每個元素是一個分組

(?#expr) expr放在(?#和)之間是就是注釋。

^expr 比對expr,并且出現在原字元串最前端的子串

expr$ 比對expr,并且出現在原字元串最末端的子串

<expr 比對expr,并且出現在一個單詞最前端的子串

expr> 比對expr,并且出現在一個單詞最末端的子串

<expr> 更嚴格的單詞比對,如:以s開頭,并且以h結尾的單詞

?regexpi(hstr, '<s\w*h>', 'match')

'such'

3. 左顧右盼——利用上下文比對

這個也比較容易了解。就是利用上下文的比對來找到我們要找的内容。

expr1(?=expr2) 找到比對expr1的子串,如果其後的字元串也比對expr2

如,下面的例子查找所有在','之前的單詞。

 ? pstr = ['While I nodded, nearly napping, ' …

'suddenly there came a tapping,'];

?regexpi(pstr, '\w*(?=,)', 'match')

'nodded' 'napping' 'tapping'

expr1(?!expr2) 找到比對expr1的子串如果其後的字元串不比對expr2

下面的例子比對所有不在','之前的單詞

?regexpi(pstr, '\w*+(?!,)', 'match')

ans = 

Columns 1 through 6

'While' 'I' 'nearly' 'suddenly' 'there' 'came'

Column 7

'a'

(?<=expr1)expr2 找到比對expr2的子串,如果其前面的字元串也比對expr1

下面的例子查找所有在','之後的單詞,注意:','之後可能有空格

?regexpi(pstr,'(?<=,\s*)\w*','match')

'nearly' 'suddenly'

(?<!expr1)expr2 找到比對expr2的子串,如果其後的字元串不比對expr1

下面的例子查找所有不在','之後的單詞,

?regexpi(pstr,'(?<!,\s*)\w*','match')

'While' 'I' 'nodded' 'early' 'napping' 'uddenly'

Columns 7 through 10

'there' 'came' 'a' 'tapping'

應課程實驗要求,要寫一個基于人人網的簡單爬蟲。實驗要求如下:

   學會使用一種程式設計語言實作爬取人人網關系網絡的程式。該程式功能如下:

1.  能夠輸入使用者登陸所産生的cookie,允許爬蟲對人人網進行爬取網頁。

2.  能夠使用正規表達式對所擷取的網頁内容進行過濾,提取出所需要的重要資訊。

3.  能夠分析所獲得資訊,得到社交網絡中各個個體之間的好友關系。

4.  能夠将該關系矩陣導入到matlab中,以供資料分析使用。

  一個正規表達式,就是用某種模式去比對一類字元串的一個公式。

  在最簡單的情況下,一個正規表達式看上去就是一個普通的查找串。例如,正規表達式"testing"中沒有包含任何元字元,它可以比對"testing"和"123testing"等字元串,但是不能比對"Testing"。

  正規表達式用于字元串處理、表單驗證等場合,實用高效。現将一些常用的表達式收集于此,以備不時之需。

   比對中文字元的正規表達式: [/u4e00-/u9fa5]

   評注:比對中文還真是個頭疼的事,有了這個表達式就好辦了

   比對雙位元組字元(包括漢字在内):[^/x00-/xff]

評注:可以用來計算字元串的長度(一個雙位元組字元長度計2,ASCII字元計1)

比對空白行的正規表達式:/n/s*/r

評注:可以用來删除空白行

比對HTML标記的正規表達式:<(/S*?)[^>]*>.*?<//1>|<.*? />

評注:網上流傳的版本太糟糕,上面這個也僅僅能比對部分,對于複雜的嵌套标記依舊無能為力

比對首尾空白字元的正規表達式:^/s*|/s*$

評注:可以用來删除行首行尾的空白字元(包括空格、制表符、換頁符等等),非常有用的表達式

比對Email位址的正規表達式:/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*

評注:表單驗證時很實用

比對網址URL的正規表達式:[a-zA-z]+://[^/s]*

評注:網上流傳的版本功能很有限,上面這個基本可以滿足需求

比對帳号是否合法(字母開頭,允許5-16位元組,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

比對國内電話号碼:/d{3}-/d{8}|/d{4}-/d{7}

評注:比對形式如 0511-4405222 或 021-87888822

比對騰訊QQ号:[1-9][0-9]{4,}

評注:騰訊QQ号從10000開始

比對中國郵政編碼:[1-9]/d{5}(?!/d)

評注:中國郵政編碼為6位數字

比對身份證:/d{15}|/d{18}

評注:中國的身份證為15位或18位

比對ip位址:/d+/./d+/./d+/./d+

評注:提取ip位址時有用

比對特定數字:

^[1-9]/d*$    //比對正整數

^-[1-9]/d*$   //比對負整數

^-?[1-9]/d*$   //比對整數

^[1-9]/d*|0$  //比對非負整數(正整數 + 0)

^-[1-9]/d*|0$   //比對非正整數(負整數 + 0)

^[1-9]/d*/./d*|0/./d*[1-9]/d*$   //比對正浮點數

^-([1-9]/d*/./d*|0/./d*[1-9]/d*)$  //比對負浮點數

^-?([1-9]/d*/./d*|0/./d*[1-9]/d*|0?/.0+|0)$  //比對浮點數

^[1-9]/d*/./d*|0/./d*[1-9]/d*|0?/.0+|0$   //比對非負浮點數(正浮點數 + 0)

^(-([1-9]/d*/./d*|0/./d*[1-9]/d*))|0?/.0+|0$  //比對非正浮點數(負浮點數 + 0)

評注:處理大量資料時有用,具體應用時注意修正

比對特定字元串:

^[A-Za-z]+$  //比對由26個英文字母組成的字元串

^[A-Z]+$  //比對由26個英文字母的大寫組成的字元串

^[a-z]+$  //比對由26個英文字母的小寫組成的字元串

^[A-Za-z0-9]+$  //比對由數字和26個英文字母組成的字元串

^/w+$  //比對由數字、26個英文字母或者下劃線組成的字元串

評注:最基本也是最常用的一些表達式

沒有整理與歸納的知識,一文不值!高度概括與梳理的知識,才是自己真正的知識與技能。 永遠不要讓自己的自由、好奇、充滿創造力的想法被現實的架構所束縛,讓創造力自由成長吧! 多花時間,關心他(她)人,正如别人所關心你的。理想的騰飛與實作,沒有别人的支援與幫助,是萬萬不能的。

    本文轉自wenglabs部落格園部落格,原文連結:http://www.cnblogs.com/arxive/p/6291685.html,如需轉載請自行聯系原作者

繼續閱讀