數(shù)據(jù)抓取之正則表達(dá)式(未)

目前在學(xué)習(xí)《基于R語言的自動(dòng)數(shù)據(jù)收集》和《用pyton寫網(wǎng)絡(luò)爬蟲》动羽,兩者都介紹網(wǎng)頁數(shù)據(jù)獲取的相關(guān)途徑,前者分析了xml镣典、json兔毙、xpath、正則表達(dá)式兄春,后者對(duì)python內(nèi)正則表達(dá)式澎剥、Beautiful Soup和Lxml三者性能比較,如下表:

image01.png

今天僅僅對(duì)正則表達(dá)式知識(shí)學(xué)習(xí)整理赶舆。Web上的內(nèi)容主要是無結(jié)構(gòu)的文本哑姚。網(wǎng)絡(luò)抓取的一項(xiàng)核心任務(wù)就是從文本數(shù)據(jù)堆中采集和我們研究問題相關(guān)的信息祭饭。

正則表達(dá)式

正則表達(dá)式是用于搜索和操作文本數(shù)據(jù)的概括性文本特征。嚴(yán)格意義上叙量,與其說它們是一個(gè)工具倡蝙,不如說它們是如何通過各種函數(shù)對(duì)字符串進(jìn)行查詢的慣例。本文介紹R中實(shí)現(xiàn)擴(kuò)展正則表達(dá)式的基本組成部分宛乃。下面字符串會(huì)貫穿本文的例子:

  R> example.obj <- "1. A small sentence. - 2. Another tiny sentence."

嚴(yán)格的字符匹配

最基礎(chǔ)的層次就是字符和字符的匹配悠咱,即使正則表達(dá)式也是如此。因此征炼,從一個(gè)字符串提取一個(gè)子串就會(huì)得到子串本身析既,如果有:

  R> str_extract(example.obj , "small")
  [1] "small"

否則,函數(shù)會(huì)返回一個(gè)缺失值:

  R> str_extract(example.obj , "banana")
  [1] NA

這里及其它部分使用的函數(shù)主要是來自stringr組件的str_extract(),我們假定這個(gè)組件的所有后續(xù)例子里都已加載了的谆奥。該函數(shù)的定義是str_extract(string , pattern),這樣首先輸入要被操作的字符串眼坏,然后就是要查找的表達(dá)式。該函數(shù)會(huì)在一個(gè)給定的字符串里返回與給定正則表達(dá)式匹配的第一個(gè)實(shí)例酸些。我們也可以調(diào)用str_extract_all()函數(shù)要求R取出每一個(gè)匹配的結(jié)果宰译。大家有興趣了解R和string字符串操作函數(shù)的比較,可以百度資料自行了解魄懂。

  R> unlist(str_extract_all(example.obj , "sentence"))
  [1] "sentence" "sentence"

由于str_extract_all()通逞爻蓿可以對(duì)多個(gè)字符串進(jìn)行調(diào)用,所以結(jié)果是作為一個(gè)列表返回的市栗,每個(gè)列表元素提供了針對(duì)其中的一個(gè)字符串的結(jié)果缀拭。上述調(diào)用中,輸入字符串是一個(gè)長度為1的字符向量填帽,因此蛛淋,函數(shù)會(huì)返回一個(gè)長度為1的列表,對(duì)它調(diào)用unlist()以便解析篡腌。下面把上述結(jié)果和同時(shí)對(duì)多個(gè)字符串進(jìn)行調(diào)用時(shí)國企函數(shù)的表現(xiàn)進(jìn)行比較褐荷。我們創(chuàng)建一個(gè)包含了"text" "manipulation" "basics"幾個(gè)字符串的向量。然后使用str_extract_all()函數(shù)來提取符合特征"a"的所有實(shí)例:

  R> out <-str_extract_all(c("text","manipulation","basics") , "a")
  R> out 
  [[1]]
  character(0)

  [[2]]
  [1] "a" "a"

  [[3]]
  [1] "a"

該函數(shù)返回一個(gè)與輸入向量長度(也就是3)相同的列表嘹悼,列表每個(gè)元素包含一個(gè)字符串的結(jié)果叛甫。因?yàn)榈谝粋€(gè)字符串里沒有a,所以第一個(gè)元素是一個(gè)空字符向量杨伙。第二個(gè)字符串包含2個(gè)a合溺,第三個(gè)字符串有1個(gè)。
默認(rèn)情況下缀台,字符匹配是區(qū)分字母大小寫的。因此哮奇,正則表達(dá)式里的大寫字母和小寫字母是不一樣的膛腐。

  R> str_extract(example.obj , "small")
  [1] "small" 

在上面的字符串里包含small睛约,而沒有SMALL。

  R> str_extract(example.obj , "SMALL")
  [1] NA

結(jié)果哲身,該函數(shù)提取不到匹配的值辩涝。我們可以用ignore.case()包裹該字符串,從而改變這種結(jié)果勘天。

  R> str_extract(example.obj , ignore.case("SMALL"))
  [1] "small"

使用正則表達(dá)式并不局限于匹配的單詞怔揩。一個(gè)字符串無非是一個(gè)字符的序列。因此脯丝,我們也可以匹配字根:

  R> unlist(str_extract_all(example.obj , "en"))
  [1] "en" "en" "en" "en"

或字母字符和空格的混合商膊。

  R> unlist(str_extract_all(example.obj , "mall sent"))
  [1] "mall sent"

正則表達(dá)式的廣義化

到目前為止,我們只是進(jìn)行固定表達(dá)式的匹配宠进。但正則表達(dá)式的威力來源于能夠編寫靈活及廣義化的查詢條件晕拆。其中最為廣義化的是句號(hào)( . )。它可以匹配任意字符材蹬。

  R> str_extract(example.obj , "sm.ll")
  [1] "small" 

在正則表達(dá)式中实幕,另一個(gè)強(qiáng)大的廣義化是字符類(character class),它被包裹在中括號(hào)里[ ]堤器。一個(gè)字符類的含義是任何中括號(hào)里的字符都會(huì)被匹配昆庇。

  R> str_extract(example.obj , "sm[abc]ll")
  [1] "small"

還有另一種方法也可以利用字符范圍來指定字符類的元素,它使用 - 闸溃。

  R> str_extract(example.obj , "sm[a-p]ll")
  [1] "small"

在這種情況下整吆,任何a到p的字符都是合法的匹配。除了字母和數(shù)字字符圈暗,也可以在正則表達(dá)式里包括標(biāo)點(diǎn)和空格掂为。相類似,它們也可以放在字符類里员串。例如勇哗,字符[uvw.]能匹配u、v寸齐、w欲诺,也能匹配句號(hào)和空格。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末渺鹦,一起剝皮案震驚了整個(gè)濱河市扰法,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌毅厚,老刑警劉巖塞颁,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡祠锣,警方通過查閱死者的電腦和手機(jī)酷窥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伴网,“玉大人蓬推,你說我怎么就攤上這事≡杼冢” “怎么了沸伏?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長动分。 經(jīng)常有香客問我毅糟,道長,這世上最難降的妖魔是什么刺啦? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任留特,我火速辦了婚禮,結(jié)果婚禮上玛瘸,老公的妹妹穿的比我還像新娘蜕青。我一直安慰自己,他們只是感情好糊渊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布右核。 她就那樣靜靜地躺著,像睡著了一般渺绒。 火紅的嫁衣襯著肌膚如雪贺喝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天宗兼,我揣著相機(jī)與錄音躏鱼,去河邊找鬼。 笑死殷绍,一個(gè)胖子當(dāng)著我的面吹牛染苛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播主到,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼茶行,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了登钥?” 一聲冷哼從身側(cè)響起畔师,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎牧牢,沒想到半個(gè)月后看锉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姿锭,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年伯铣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了艾凯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡懂傀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜡感,到底是詐尸還是另有隱情蹬蚁,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布郑兴,位于F島的核電站犀斋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏情连。R本人自食惡果不足惜叽粹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望却舀。 院中可真熱鬧虫几,春花似錦、人聲如沸挽拔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽螃诅。三九已至啡氢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間术裸,已是汗流浹背倘是。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袭艺,地道東北人搀崭。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像匹表,于是被迫代替她去往敵國和親门坷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容