Rpy|字元串處理|綜述

專題定位

本專題會對R和python的字元串處理部分進行系統的講解。讀者可能會問,無論是R還是python的字元串處理,網上都能找到非常多非常系統的教程,我們這個專題有什麼特別的地方呢?

本專題可以說是系統之上的系統化,我非常希望更多的人可以掌握這種學習思路,這種學習方法可以應用到其他方方面面。所以在我看來,與其說本專題是在講字元串處理,不如說是借著字元串處理這個方向,講述這種學習方法。

因為這種定位,所以我不能對每個函數的使用方法面面俱到,所以希望想要系統了解R和python有哪些函數、函數怎麼用的讀者,可以先看一看下面列出的這些資源和學習方法,我後面講解的時候會用一些函數,有的因為篇幅問題無法列出結果,讀者需要能夠大致判斷輸出什麼結果。

下面我們說一說專題包含哪些內容,文章最後會指明這種學習理念。

針對字元串處理,本專題分為以下幾塊內容

  • R自帶函數
  • R包stringr
  • python的字元串方法、配合re模塊的正則表達式。
  • pandas庫的字元串向量化操作

這四個部分都可以獨立完成字元串處理過程,下面為掌握每個部分的函數使用的學習資源或方法.

專題內容

R基礎部分

R基礎字元串處理函數

nchar paste strsplitntolower toupper casefoldnchartr gsub subnsubstr substringngrep grepl regexprn

這些函數在下面的文章中我會全部用一遍作為實例,但是肯定不全面,如果想要完全掌握,建議用help()函數一個一個查看文檔學習。查看文檔時,先看例子,有不懂的再回來看說明,最後最後再回來把參數一個一個了解了。

關於R自帶字元串處理函數,百度一下也非常多,這裡貼一個

R包stringr

只需要將官方文檔中的每個函數都學一遍就可以,使用命令查看文檔

help(package=stringr)n

python的字元串方法及re庫

需要掌握python基礎,列表方法和字元串方法,學習過re庫,這個庫是python的正則表達式標準庫,裡面也涉及一些字元串的操作方法,官方文檔見這裡

正則表達式

處理過程中可能需要使用正則表達式。下面貼兩篇教程

R語言正則表達式

R語言正則表達式應用

python正則表達式re庫官方文檔(英文)

中文教程1

pandas庫

pandas庫是python數據分析的強大第三方庫,這個庫的功能相當於R語言中的數據框的處理。其中處理字元串的部分看這裡

學習方法

這種學習方法整理成兩個詞就是:對比和框架化

對比

由於R和python處理字元串的函數的設計理念不同,使用同樣解決一個問題的思路是不相同的,零碎地學習和使用,會讓人感覺腦中很亂。這個專題,我回分析各種方法的特點,總結出各種方法的優勢與劣勢,弄清楚最適合它們的使用場景。

框架化

每次學習看到教程中的那麼多函數,即使每個都理解是怎麼用的了,但是心中也無法形成很明確的概念。當我們遇到問題的時候,我們會先懷疑這個問題可不可以用之前學過的方法處理,有時還會感覺到可能有多種方法可以達到同一個目標。這種思維混亂正是因為沒有將知識系統化、框架化。

框架化需要事先總結我們要處理的問題有哪些種類,總結得越細越好,越全面越好。我們帶著這個框架去學習,就能自動地將學到的函數歸到某一類,學習成為一個不斷填充、不斷完善知識體系的問題。最後這個體系不斷壯大,我們可以迅速提取出處理一個問題的若干種方法;我們也可以明確的知道哪一類問題是目前沒有辦法解決的,接下來可以查閱資料,補全系統;遇到體系之外的問題時,雖然當下不知如何解決,但是你還是會欣喜若狂,因為你見到了一片新天地,你可以將其補充進來,擴大自己的體系,我們能清楚地看到自己的進步,學習會變成一種快樂。我們有時為了完善這個體系,會自己給自己出難題,你的體系越完整,處理問題和交流起來越有自信,因為你對自己的能力有這清晰的認識。

框架化需要思考,需要總結。人最擅長逃避的不是行動,而是思考。

框架化的學習不只應該體現在這種精深的學習之中,而且還應該應用於一些你暫時沒有時間進入的領域。

我一直非常主張在精通一個方向的同時,也要在多個領域,花較少量的時間,形成基本的認識,形成知識的框架。達到專家級別總是需要大量的積累,需要大量的時間,但是形成基本的框架卻不需要這麼多時間,不過形成框架是一個比較艱難的過程,因為你要弄懂這個領域基本的常識,需要大量的思考和總結,構建一個體系。這個過程雖然艱辛,但是一旦形成,以後的每一次接觸都是一種填充、一種有效的學習,因為你知道自己掌握了什麼,自己需要什麼。

  • 舉一個例子,在我剛開始學習爬蟲的時候,我不知道什麼是url;不知道什麼是解析網頁;不知道header那麼多參數是幹什麼的;不知道爬蟲具體是幹什麼的,它是能幫我更精確地搜索全網得到我需要的數據呢,還是只能爬下我當前找到的頁面。這些內容都是爬蟲最基本的常識,很多寫博客的人都沒有意識到初學者怎麼連這些都不知道,他們直接使用這些名詞,初學者會越來越蒙圈。

  • 第二個例子,我經常發現一個現象,很多大神感覺方方面面都很強,我們都很驚嘆他們怎麼會有這麼多時間做到那麼多我們可望而不可即的事情。後來我想到了一個原因,他們可能很早就有意識或沒意識地對很多事情形成了基本的框架,平時的生活中,同樣的事情,他們可以收穫到更多。比如我們看TED演講

    • 最基本的人汲取演講者的思想
    • 如果這個人此時在學英語,他可以同時練習聽力,看演講者的嘴型,練習發音
    • 如果這個人先前對演講有研究過,他可能無意間看到演講者一個演示的說話方式、表情、動作非常棒,便把它添加到了自己的體系之中,為自己所用
    • 如果這個人系統地了解過PPT製作,它會從演講者的PPT中汲取到靈感
    • 其他方面包括穿著,甚至提到的某個人、某個觀點,都有可能直達你的內心

我覺得一般不會有人會時時刻刻刻意地去抓住這些信息,但是這些收穫旺旺是不經意間的,我們每一天都會發生各種各樣的大事小事,他們可能也不知道他們已經無形中收穫了比別人更多的東西,日積月累,回頭再看,會發現積累了非常多。

也許你沒有事先學習過那些方面的基礎知識,也可以注意到一些技巧,但是這就是所謂的碎片化學習,學過一段時間就會忘得乾乾淨淨,因為一個個孤立的知識,沒有和其他知識連接成一個網路,是一定無法保留長久的。

以上兩個例子是我用來說明框架化的重要性的,然而二者在一起也可以作為一個說明如何對比、如何思考的例子。看完以上的兩個例子,讀者可能會覺得這個有點道理,那個也有道理,但是如果不去細想兩個例子之間的聯繫和區別,就不會發現二者其實是在說「框架化」的兩個不同方面的作用的。第一個例子是說明如果沒有事先學習基礎,日後遇到了別人的談論或者某一篇好文章,根本就不懂他們在說些什麼,也就浪費了時間沒有收穫到什麼。第二個例子針對的內容不是像爬蟲這種有一些專業術語、難以理解的東西,而是那些你能懂,但是如果沒有系統整理,就會亂成一團,無法讓其為己所用。

以上內容跟字元串沒有太大關係,只是提供一種學習的思路,本專欄以後的介紹很多會遵循這樣的思路,總結每一個專題。下面我們將把這個思路應用在字元串的學習上,讓大家有更深的體會。

字元串處理學習思路

字元串學習系統化相比於其他領域簡單了很多,我們只要從字元串處理需求入手,就可以對其形成基本框架,之後無論用R還是python,我們都可以把函數對號入座。這個框架不僅僅起到提醒的作用,而且便於查缺補漏。

字元串處理需求

  • 拼接
    • 對應拼接,如 (『a』,』b』)+(『c』,』d』) → (『ac』,』bd』)
    • 多拼為一,如 (『a』,』cd』,』m』) → (『acdm』)

  • 拆分(根據pattern)
    • 如』a.b.c.d』 → (『a』,』b』,』c』,』d』)

  • 替換
    • 大小寫轉換
    • 根據位置,如字元串第3位到第5位換掉
    • 根據pattern,如把所有』s』換成』c』

  • 提取
    • 根據位置,如提取字元串第3位到第5位
    • 根據pattern,如提取所有數字
    • 根據pattern還會遇到:想要的內容沒有規律,只能依賴旁邊有規律的pattern

上面的框架我們畫個圖來表示

對於使用R和python處理字元串的四大方法,按照這個框架介紹完每一種之後,我會用該方法處理相同問題,讓讀者對這些方法的應用有一個更直觀的認識。

由於提取問題比較能體現出四種方法的差異性,所以我選擇了如下兩個問題。

a <- "var Run_Arr = [ 1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,28,28,28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29,29,30,30,30,30,30,30,30,30,30,30,31,31,31,31,31,31,31,31,31,31,32,32,32,32,32,32,32,32,32,32,33,33,33,33,33,33,33,33,33,33,34,34,34,34,34,34,34]"n

從上面字元串中,將所有數字提取出來,組成一個向量,每個數字作為向量的一個元素。

b <- <span class="title">肖申克的救贖</span>n<span class="title"> / The Shawshank Redemption</span>n<span class="other"> / 月黑高飛(港) / 刺激1995(台)</span>nn<span class="title">這個殺手不太冷</span>n<span class="title"> / Léon</span>n<span class="other"> / 殺手萊昂 / 終極追殺令(台)</span>nn<span class="title">霸王別姬</span>n<span class="other"> / 再見,我的妾 / Farewell My Concubine</span>n

上面這個字元串是從網頁源碼中截取下來的一部分,我們要從上面的字元串中,提取三個電影名,組成一個向量。

這兩個問題有一個區別,直接導致了處理難易程度上的不同。

  • 前者數字時有專門正則表達式匹配的,即使用的pattern對應的正是我們想要的內容。
  • 而後者電影名和其他字元相同,沒有專門的正則表達式,(當然你也可以去百度中文的專屬匹配規則,不過這樣的話對英文電影就無效了,我們要尋求的是一種通用方法。)此時我們只能通過匹配包裹電影名的標籤的規律來找到我們想要的位置(這裡還有其他的與之標籤相同的干擾項,我們在處理的時候再說)。這就是我們所說的pattern匹配內容不是我們想要的情況。

以上對本專題的定位,思想及內容做了一個介紹,接下來,我會分為R和python兩篇文章詳細闡述這四種方法。

專欄信息

專欄主頁:Data Analysis

專欄目錄:目錄

文末彩蛋

上面那張樹狀圖是用R語言畫的,這裡附上代碼和學習資源

library(DiagrammeR)ngrViz("ndigraph boxes_and_circles {ngraph [rankdir = LR]n 字元處理需求->{拼接 拆分(根據pattern) 替換 提取}n拼接->{多拼為一 對應拼接}n替換->{大小寫轉換 根據位置 根據pattern(正則表達式)}n提取->{根據位置 根據pattern(正則表達式)}n根據pattern(正則表達式)->{pattern正是想要的 pattern引出想要的}n}n")n

安裝該包,看上面代碼就可以照葫蘆畫瓢,如果想要深入地學習,可以help該函數的文檔,也可以看這個網站


推薦閱讀:

R文件系統管理
使用quantmod包獲取股票走勢
win 10系統下R語言的升級

TAG:正则表达式 | R编程语言 | Python |