正則表達式中經常使用符號

一:html

 

正則在Perl、Py森、Ruby、Java等語言中文本的正則表達式幾乎是同樣的正則表達式

 

之前經常使用到的在網上都有現成的例子拿來用,好比電話格式、郵箱格式之類的。數據庫

 

可是天然語言處理中每每會根據本身的需求來制定一個表達式,若是正則的知識掌握的比較片面,在編寫天然語言處理程序時可能會以爲苦惱。app

 

在《天然語言處理簡明教程》裏面有很系統的正則表達式教程,特地總結出來消化吸取。spa

 

二:3d

 

  • 雙斜線「//」

    最簡單的正則表達式就是這樣的,由相似於/hello world /的正則來搜索語料庫中包含子字符串「hello world」的任何字符串相匹配。/e/是能夠匹配到字符串hello的。日誌

 

 

  • 中括號「[]」

    []會匹配其中的某一個字符。好比如今有嫌疑人,咱們只知道他的名字多是下面三種的某一種,分別是張偉、李偉或者黃偉。就可使用/[張李黃]偉/來在人口數據庫中匹配。htm

正則blog

匹配教程

模式例子

/[hH]/ello/

 

/[abc]/

 

/[1234567890]/

hello or Hello

 

‘a’或者’b’或者’c’

 

數字

Hello!」

 

「happy~」

 

1993年」

 

 

 

 

 

 

 

 

  • {}表示限制長度。如:.{1}表示匹配一個任意字符 

 

  • 連字符「-」

    用來劃定範圍,表示某一範圍內的任何字符。好比上個例子裏面的/[1234567890]/是否是感受很不方便。若是表示爲/[0-9]/就會顯得精簡的多。

正則

匹配

模式例子

/[A-Z]/

 

/[a-z]/

 

/[0-9]/

大寫字母

 

小寫字母

 

數字

Hello!」

 

happy~」

 

1993年」

 

 

 

 

 

 

 

 

  • 脫字符「^」

    若是在方括號以後有脫字符「^」,對應的模式就是否認的。

正則

匹配

模式例子

/[^A-Z]/

 

/[^aA]/

 

/[0-9]/

非大寫字母

 

既不是a也不是A

 

數字

「Hello!」

 

happy~」

 

1993年」

 

 

 

 

 

 

 

 

  • 問號「?」

    好比咱們在語料庫中搜索詩人「李白」或者「李太白」,此時方括號就沒法幫助咱們,由於[]只能表示xx或者XX,可是不能表示有xx或者沒xx。此時能夠用「?」來表示前一個字符有或者無。

正則

匹配

/李太?白/

 

/times?/

「李白」或者「李太白」

 

time或者times

 

 

 

 

 

 

 

  • 「Kleene*」

    當正則表達式用來表示重複的字符時,好比在下載文件時,出現了下面的下載進度:

99.9%

99.99%

99.999%

99.9999%

……

此時咱們能夠用/9*/來表示重複了「0或者若干次」的字符「9」,所以想表示出現了一次或者屢次的「9」,須要用/99*/。

所以/99\.99*%/能夠用來表示上述進度條。(此處的「.」須要轉譯,由於咱們不想讓他表示爲通配符)

稍微複雜點:

/[10]*/能夠用來表示一個二進制串,好比「1010100001110001」

 

 

  • 「Kleene+」

可是我用/99*/來表示重複了「0或者若干次」的字符「9」時總以爲多寫了一個「9」很不爽,這時有沒有辦法幫咱們省掉多打一個「9」的時間呢?

/9+/就能夠了~

所以使用/[10]+/來搜索語料中的二進制字符串看起來更順手

 

 

  • 通配符「.」

哎那個馬什麼民,幫我把襪子洗一下。

這樣說話是很不禮貌的,可是當咱們確實忘了別人名字時怎麼辦呢?

正則表達式一樣能夠解決這個問題。

正則裏面有一個點號,通配符(/./)能夠表示任何字符。

/馬.民/能夠在你的班級花名冊裏面搜索到全部叫「馬X民」的人。

 

正則

匹配

模式例子

/[beg.n]/

 

beg和n中包含一個字符的字符串

begin,beg‘n,begun

 

 

 

 

 

 

當/./和/*/或者/+/碰到時,什麼神奇的事情會發生呢?

好比咱們想知道有一天 馬X民對黃偉作了什麼事情,怎麼寫正則來在班級日誌裏面縮小搜索範圍呢?

/馬.民.+黃偉/就能夠表示在一個長字符串裏面,符合馬X民bulabula黃偉的句子。

 

  • 錨號「^」和「$」

顧名思義,錨號是用來把正則「錨」在字符串的特定位置的。最普通的錨號是「^」和「$」,當「^」用做錨號的時候,表示一行的開始。好比/^The/就表示單詞The必須出如今一句話的開頭。相反「$」表示一行的結尾。

回到上面的例子,好比咱們想在班級日誌裏面找到「馬興民xxx黃偉。」這樣的句子,就可使用錨號來定位。/^馬興民.+黃偉。$/

 

  • 詞界「\b」「\B」

  

\b表示詞界,\B表示非詞界。

首先,在計算機語言裏面,什麼是一個詞呢。從技術上說,詞被定義爲數字、下劃線、或者字母的任何序列。

好比咱們在搜索單詞「a」的時候,若是僅僅用/a/,一樣會匹配到相似於「happy」這樣的單詞,可是若是用/\ba\b/的話,就會只找到單詞a。好比「I am a handsome man.」

它僅僅會匹配到單詞「a」而非「am」。

 

  • 析取符「|」

析取符表示或者。

前面有個小夥子很眼熟,我記得他的名字叫馬興民或者黃偉。如今我打開在線班級花名冊,輸入正則/黃偉|馬興民/,一下就找到了兩我的的信息和照片,一看哦都不是。

析取符就是用來表示或者,/a|b/表示a或者b。

在英文語料中,有時候會出現名詞的複數形式好比cat和cats,這種形式咱們很容易表達。可是有些複數好比family的複數families該如何表達呢。

首先famil串已是固定的了,這時咱們只須要尾串跟上y或者ies便可,此時咱們使用圓括號運算符(),將一個模式括起來,使得它就像一個單獨的字符。所以若是咱們想找到語料中的family和families時,須要用/famil(y|ies)/,析取符僅僅運用於後綴y或者ies。

 

 

三:

  •  通用字符集的替換

  

正則

擴充表達式

匹配

\d

\D

\w

\W

\s

\S

[0-9]

[^0-9]

[a-zA-Z0-9]

[^\w]

[_\r\t\n\f]

[^\s]

數字字符

非數字字符

數字字母下劃線

相反

表格,換行等空白區域

非空白區域

 

 

 

 

 

 

 

 

 

  • 計數符

正則

匹配

*

+

?

{n}

{n,m}

{n,}

零或多

一或多

零或一

出現n次

n到m次

至少n次

 

 

 

 

 

 

 

 

  •  ? 貪婪模式與非貪婪模式

     好比在HTML中有許多標籤<div>part1</div><div>part2</div><div>part3</div><div>part4</div>

    使用<div>.*</div>匹配到的是:<div>part1</div><div>part2</div><div>part3</div><div>part4</div>,此時爲貪婪模式。

    使用<div>.*?</div>匹配到的是:<div>part1</div>

  • (?<=exp) (?=exp)零寬斷言

    (?<=exp) 表示匹配exp以後的,(?=exp)表示匹配exp以前的。

    好比上面標籤例子:<div>part1</div><div>part2</div><div>part3</div><div>part4</div>

    若是咱們僅僅想拿到標籤裏面的內容,就可使用零寬斷言:

    (?<=<div>).*(?=</div>)此時匹配到:part1</div><div>part2</div><div>part3</div><div>part4

    結合上面的零寬斷言:

    (?<=<div>).*(?=</div>)此時匹配到:part1 part2 part3 part4

    

  • 一個開發思路的例子

    當咱們想在語料中查找英語冠詞the的時候,隨手寫下正則/the/。

    可是隨後發現有些地方是不完善的,好比當the出如今開頭的時候,就是The,所以咱們把正則改爲/[tT]he/。

    此時這個正則仍是不完善的,由於它會找到諸如There,other這樣的單詞,所以咱們給它加上了詞界/\b[tT]he\b/。

    問題又來了,假如咱們不想把下劃線和數字做爲詞界,咱們還但願可以找到形如 _the,the99這樣的詞。此時咱們須要給the的兩段加上限制:不能爲字母。因而正則變成了/[^a-zA-Z][tT]he[^a-zA-Z]/。

    萬事大吉了嗎?這時候咱們發現,當the出如今開頭的時候,正則找不到它,由於咱們規定了the的開頭必須有一個非英文字符,所以咱們須要修改開頭爲,the出如今開頭或者開頭有一個非英文字符。即/(^|[^a-zA-Z])[tT]he[^a-zA-Z]/。

 

    終於到這裏,一個符合要求的簡單的定冠詞the被搜索了出來。

    平時書寫正則的時候也要注意,提高準確率,提高覆蓋率。

  •  第二個例子

用正則給字符串添加空格

 

  •   附上一個正則符號表

圖片出處:

http://bbs.9ria.com/thread-3900-1-1.html

相關文章
相關標籤/搜索