R語(yǔ)言基礎(chǔ)7--R語(yǔ)言中的正則表達(dá)式


R語(yǔ)言基礎(chǔ)系列:


  • 定義:正則表達(dá)式是對(duì)字符串[包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為"元字符")]操作的一種邏輯公式,就是用事先定義好的一些特定字符及這些特定字符的組合,組成一個(gè)"規(guī)則字符串",這個(gè)"規(guī)則字符串"用來(lái)表達(dá)對(duì)字符串的一種過(guò)濾邏輯。正則表達(dá)式是一種文本模式,該模式描述在搜索文本時(shí)要匹配的一個(gè)或多個(gè)字符串。

  • 目的:給定一個(gè)正則表達(dá)式和另一個(gè)字符串,我們可以達(dá)到如下的目的
    1. 給定的字符串是否符合正則表達(dá)式的過(guò)濾邏輯(稱作"匹配"):
    2. 可以通過(guò)正則表達(dá)式,從字符串中獲取我們想要的特定部分。

  • 特點(diǎn)
    1. 靈活性、邏輯性和功能性非常強(qiáng);
    2. 可以迅速地用極簡(jiǎn)單的方式達(dá)到字符串的復(fù)雜控制。
    3. 由于正則表達(dá)式主要應(yīng)用對(duì)象是文本,因此它在各種文本編輯器場(chǎng)合都有應(yīng)用,小到著名編輯器EditPlus,大到Microsoft Word、Visual Studio等大型編輯器,都可以使用正則表達(dá)式來(lái)處理文本內(nèi)容。

??R中的grepgreplsubgsubregexprgregexpr等函數(shù)都使用正則表達(dá)式的規(guī)則進(jìn)行匹配。
這些函數(shù)的用法見(jiàn):字符串的處理

1. 原義表達(dá)式

mystring1 <- c('apple','orange')
grep('p',mystring1)
# [1] 1

p匹配的是它自己,這就是原義表達(dá)式。

2. 轉(zhuǎn)義表達(dá)式(它在正則表達(dá)式中代表的不是它自己,而是有別的含義)

2.1:. 表示除了換行符以外的任一字符
 mystring2 <- c('huihui','.dfs','-lhr')
grep('.',mystring2)
# [1] 1 2 3

sub("a.c","",c("abcd","sdacd"))
[1] "d"     "sdacd"

本來(lái)只想匹配 . ,但是在這里這個(gè)點(diǎn)代表了所有字符,于是返回了1 2 3。這個(gè). 就是一個(gè)轉(zhuǎn)義表達(dá)式。

2.2: [ ]
mystring3 <- c('33l','.jz19','hal6')
grep('[7:9]',mystring3)
# [1] 2

grep('[3-4]',mystring3)
# [1] 1

sub("[1-9]","",c("ab001","001ab"))
[1] "ab00" "00ab"

分別提取含7-9的數(shù)字或3-4的數(shù)字的字符串

2.3: ^ 匹配一個(gè)字符串的開始

^XX就是以XX開頭的意思

mystring4 <- c('Alice','apple','abandon','Hayley','application')
grep('^ap',mystring4)
# [1] 2 5

sub("^a","",c("abcd","dcba"))
[1] "bcd"  "dcba"

當(dāng)^放在方括號(hào)內(nèi)是取非的意思

grep('[^7-9]',mystring3)
# [1] 1 2 3
2.4: { } 表示重復(fù)幾次的作用
mystring5 <- c('1220','2289','2228','10002')
grep('2{2,3}',mystring5)
# [1] 1 2 3

2{2,3}是尋找2倍重復(fù)了2到3次的意思
2{2,}是尋找2倍重復(fù)了大于2次(2到+無(wú)窮)的意思

2.5: + 匹配1或多個(gè)正好在它之前的那個(gè)字符
mystring6 <- c('food','foot','for','fans')
grep('fo+',mystring6)
# [1] 1 2 3
grep('fo{1,}',mystring6)
# [1] 1 2 3

fo+表示+緊跟著的o可以被重復(fù)1次或1次以上
大括號(hào)也可以起到這樣的作用

若想讓緊跟在o后面的對(duì)fo都起作用,需要小括號(hào)

grep('(fo){1,}',mystring6)
# [1] 1 2 3
2.6: * 表示將其前的字符進(jìn)行0個(gè)或多個(gè)的匹配

與+用法一致。+表示重復(fù)了1次或1次以上,*表示0次或0次以上。
.* 可以匹配任意字符

2.7: 管道符| 表示邏輯的或
mystring7 <- c('kobe','messi','meymar')
grep('^k|^m',mystring7)
# [1] 1 2 3

管道符連接前后,符合其一即會(huì)被返回

2.8: $ 匹配字符串的結(jié)尾
mystring8 <- c('active','positive','negative','intension')
grep('ive$',mystring8)
# [1] 1 2 3

sub("a$","",c("abcd","dcba"))
[1] "abcd" "dcb"

\\b也可以起到一樣的作用,但\\b更靈活,既可以放開頭也可以放結(jié)尾。(\\b主要是匹配邊界)

2.9: ? 匹配0或1個(gè)正好在它之前的那個(gè)字符
  • 匹配任意多個(gè)字符(0-正無(wú)窮個(gè))
    ?匹配任意單個(gè)字符(1個(gè))

3. 保義字符: \

mystring9 <- c('active','pos^itive','negative','^intension')
grep('\^',mystring9)
# Error: '\^' is an unrecognized escape in character string starting "'\^"
grep('\\^',mystring9)
# [1] 2 4

\的作用就是說(shuō)明^不是開頭的意思,是要去匹配這個(gè)符號(hào)
對(duì)所有的轉(zhuǎn)義符號(hào)都適用

4. 正則表達(dá)式中的特殊字符

特殊字符 匹配內(nèi)容
\\b 匹配字符邊界
\\B 匹配字符非邊界
\\d 匹配數(shù)字0-9,等價(jià)于[0:9]
\\D 等價(jià)于[^0:9] 取非0-9
\\s 匹配空白的字符,包括空格、換行符等
\\S 匹配非空字符
\\w 匹配字母和數(shù)字(a-z A-Z 0-9..)
\\W 匹配非字母和數(shù)字
\\ < 匹配以空白字符開始的字符
\\ > 匹配以空白字符結(jié)束的字符
mystring10 <- c('2013','abcd','13sg')
grep('\\d',mystring10)
# [1] 1 3
grep('\\D',mystring10)
# [1] 2 3

mystring11 <- c('','    abcd','13  sg','apple')
grep('\\S',mystring11)
# [1] 2 3 4    空格也是一種空白,所以2和3也被返回了

mystring12 <- c('theory','the republic','they')
grep('\\<the\\>',mystring12)
#[1] 2
mystring13 <- c('theory','the republic','   the')
#[1] 2 3
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評(píng)論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,676評(píng)論 3 419
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,730評(píng)論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,873評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,266評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評(píng)論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,482評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,036評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,846評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,025評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,279評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評(píng)論 1 289
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,751評(píng)論 3 394
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,016評(píng)論 2 375

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