R語言之字元函數和正則表達式

字元串長度函數:

length():返迴向量元素的個數、矩陣元素的個數、數據框欄位數量和列表元素的個數。

nchar()返回每一個字元值的字元數

cat()函數可以顯示和連接字元串。該函數可以將字元值合併,並直接列印在屏幕中,該函數成為在函數內部列印消息或警告信息的理想函數,而paste()函數和print()函數輸出效果不理想。

發現,用print函數和paste函數在屏幕中輸出帶引號的字元串,總覺得有點彆扭。

cat()函數中使用n參數為換行符,確保改行的完整信息。t為4位元組的空格

cat()函數的參數fill可用於輸出字元串中自動插入換行符,如果fill設置為TRUE,則系統的width值將被用來確定行寬,如果fill參數為一個給定的數值,則輸出結果的寬度將使用該值。

cat()函數中有一個參數為file,該參數允許輸出結果指定到一個文件中。

paste()函數可以無限量的連接字元串,當把一個字元向量傳遞給paste()函數時,通常使用collapse=參數,因為sep=參數對輸入的向量不起作用

substring()或substr()函數獲取字元串的子串,first(start)和last(stop)參數可以是一個數值,也可以是一個向量。

在應用中強烈建議使用substring()函數,該函數更為穩定

為了找到字元串中一個特定字元的位置,首先需要將字元串轉換為字元向量(可以向substr函數的first和last參數傳遞向量來完成),然後通過which函數確定某個字元的位置

正則表達式是一種表達字元值模式的方法,可以被用來提取字元串的一部分或以某種方式修改這些字元串。這裡主要講解R中常用的6個正則表達式函數(split,grep,regexpr,gregexpr,sub,gsub)

strsplit()函數可以使用字元串或正則表達式將字元串劃分為更小的段,該函數的第一個參數是要拆分的字元串,第二個參數是用來將字元串分解成多個部分的字元值或正則表達式。該函數將分解後的子段返回到列表中。

語法如下:

strsplit(x, split, fixed = FALSE, perl = FALSE, useBytes = FALSE)

應用:

發現,parts1中會單獨把空格當做值列出來。

案例,把數據框中的郵箱子段拆分成郵箱名和郵箱地址兩個欄位。

個人覺得這個方法還是繁瑣了點,還請各位看官提出更方便簡潔的方法~謝謝啦。

strsplit()函數還可以接受正則表達式來決定在哪裡拆分字元串,例如,一個字元串中含有多個空格,當使用空格作為拆分符時,就可能返回多餘的空字元串

grep()函數接受一個正則表達式和一個字元串或字元串向量,並返回由正則表達式匹配的字元串元素的索引。如果參數value=TRUE,則它將返回與正則表達式匹配的實際字元串而不是其索引號。

語法如下:其中x必須為字元向量

grep(pattern, x, ignore.case = FALSE, perl = FALSE, value = FALSE,fixed = FALSE, useBytes = FALSE, invert = FALSE)

應用:該函數的一個重要用途是依據名稱從一個數據框中提取一組變數

如在LifeCycleSavings數據框中,存在兩個變數,都是以pop開頭,我們可以使用grep函數找到這兩個變數

返回以某個字元開頭或某個字元結尾的字元串

要查找的正則表達式不考慮輸入的大小寫時,可以使用ignor.case=TRUE

很顯然第二個字元work doggedly就不是我們所期望的結果,為解決該問題,可以使用轉義尖括弧(<dog>)限制字元串被空格、標點符號或起始行或結束行包圍情況下的匹配。

如果傳遞給grep的正則表達式與其任何輸入都不匹配,grep將返回一個空的數值型向量,換句話說,該函數可以用來測試一個正則表達式是否存在。

regexpr()和gregexpr()函數可用於準確指出和提取字元串中與正則表達式相匹配的部分,這兩個函數的輸出為一個向量和列表,由所發現的正則表達式的起始點組成;如果沒有匹配發生,返回值為-1,此外,match.length屬性與起始點向量結合,提供字元匹配的準確信息。regexpr函數只提供其輸入字元串中第一個匹配的有關信息,而gregexpr函數返回所有匹配的信息。

語法如下:

regexpr(pattern, text, ignore.case = FALSE, perl = FALSE,

fixed = FALSE, useBytes = FALSE)

gregexpr(pattern, text, ignore.case = FALSE, perl = FALSE,

fixed = FALSE, useBytes = FALSE)

應用:

提取出匹配的字元

在這裡使用另一個處理輸出的函數mapply,該函數的第一個參數為函數,接受多個參數,其餘參數是長度相同的向量,其元素將逐一傳遞到函數中。

sub()和gsub()函數是基於正則表達式的文字替換,它們均接受正則表達式的輸入參數。

sub()函數只改變第一次出現的正則表達式,而gsub()函數可以替換所有滿足正則表達式的字元。

這兩個函數的一個重要用途涉及到數值型數據中,這些數據從網頁或財務報表中讀入,並可能包含逗號或美元符號。

語法:

sub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,

fixed = FALSE, useBytes = FALSE)

gsub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,fixed = FALSE, useBytes = FALSE)

應用:

大致正則表達式的語法和案例就介紹到這裡,接下來對正則表達式做一些總結性的工作(參考《R語言數據操作》這本書):

1、反斜杠字元用在正則表達式中,表示正則表達式中某些具體特殊含義的字元應該作為普通的字元來對待。在R中,當遇到特殊字元時(t,n等)需要輸入兩個反斜杠。

2、正則表達式由3個部分組成:

a、原意符,它是由一個單一的字元匹配

b、字元類,它可以與許多字元值的任何一個相匹配

c、修正符,對原意符和字元類進行操作

3、由於許多表點符號是正則表達式的修正符,必須始終加一個反斜杠保留其原意:

. ^ $ + ? * ( ) [ ] { } |

4、要形成一個字元類,使用方括弧[]把需要匹配的字元括起來。如需要創建一個由a,b或3組成的字元類,可用[ab3]表示。破折號可用在字元類內部來表示值域[a-z],[A-Z],[0-9]

5、如果在R中輸入一個正則表達式,是使用雙引號的字元串,就需要雙反斜杠,如果使用readline輸入表達式,只需要一個反斜杠。

6、R中正則表達式的修正符:

修正符 含義

^ 定位表達式,目標開始

$t定位表達式,目標結束

. 匹配換行符以外的任何單個字元

| 分割不同的模式

( ) 將相同模式放在一起

* 匹配前面的實體出現0次或更多次

? 匹配前面的實體出現0次或1次

+ 匹配前面的實體出現1次或更多次

{n} 匹配前面的實體精確地出現n次

{n,} 匹配前面的實體至少出現n次

{n.m} 匹配出現次數在n和m次之間

總結:常用的字元串函數

length()

nchar()

cat()

paste()

substring()

strsplit()

grep()

regexpr()

gregexpr()

sub()

gsub()

作者:劉順祥

公眾號:每天進步一點點

博客專欄:每天進步一點點2015

友情提醒:本周四晚上8點半,劉順祥老師《手把手教你做文本處理》歡迎大家報名:Hellobi Live | 手把手教你做文本處理 內容:1、jiebaR的簡介及切詞 2、文字雲的繪製;3、tm包的簡介及構建文檔詞條矩陣; 4、聚類的簡單使用; 。可以加下小編微信:tswenqu,可以到對應微信群跟順祥老師互動。
推薦閱讀:

怎樣求下圖中y關於x的表達式呢?
R語言常用函數匯總
函數的內積為什麼要這麼定義?
關於偏導數複合函數的定義 是否存在矛盾?
算NPV的題目,為什麼excel的npv函數和數學方法算的差別那麼大?

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