正則表達式

2021-02-20 數據志


         正則表達式表通常被用來檢索、替換那些符合某個模式(規則)的文本。在我看來,正則表達式的主要用途有兩種:①查找特定的信息②查找並編輯特定的信息,也就是我們經常用的替換。。比如我們要在Word,記事本等裡面使用快捷鍵Ctrl+F,進行查找一個特定的字符,或者替換一個字符,這就使用了正則表達式。

         正則表達式的功能非常強大,尤其是在文本數據進行處理中顯得更加突出。R中的grep、grepl、sub、gsub、regexpr、gregexpr等函數都使用正則表達式的規則進行匹配。這幾個函數原型如下:

grep(pattern, x, ignore.case = FALSE, perl = FALSE, value = FALSE,     fixed = FALSE, useBytes = FALSE, invert = FALSE)grepl(pattern, x, ignore.case = FALSE, perl = FALSE,      fixed = FALSE, useBytes = FALSE)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)regexpr(pattern, text, ignore.case = FALSE, perl = FALSE,        fixed = FALSE, useBytes = FALSE)gregexpr(pattern, text, ignore.case = FALSE, perl = FALSE,         fixed = FALSE, useBytes = FALSE)regexec(pattern, text, ignore.case = FALSE, perl = FALSE,        fixed = FALSE, useBytes = FALSE)

   這裡是對參數進行一個解釋說明。

參數

說明

pattern

正則表達式

x, text

字符向量或字符對象,在R 3.0.0後版本中,最大支持超過2^31個的字符元素。

ignore.case

默認FALSE,表示區分大小寫,TRUE時表示不區分大小寫。

perl

是否使用Perl兼容的正則表達式

value

默認為FALSE,當查找到時返回1,否則返回0;當為TRUE查找到時返回整個x,text,否則返回0。

fixed

如果為TRUE,pattern是要匹配的字符串。覆蓋所有衝突的參數

useBytes

默認為false,當為true時,則是逐字節逐字節匹配而不是逐字符逐字符匹配。

invert

如果TRUE返回不匹配的元素的索引或值。

replacement

如果查找到之後,進行替換,若沒有找到,則返回x,text值

接下來我們對這幾個函數談談他們的不同點。

函數

作用

grep()

查找,存在參數value,返回結果是匹配項的下標

grepl()

查找,返回值為true

sub()

只對查找到的第一個內容進行替換。(同下)

gsub()

對查找到的所有內容進行替換,返回替換後的text;否則直接返回text

regexpr()

返回一個與給出第一個匹配的起始位置的文本長度相同的整數向量,如果沒有則返回-1, 「match.length」給出匹配文本長度的整數向量(或-1)。匹配位置和長度為字符。

除了regexec,目前不支持Perl風格()的正則表達式。

。useBytes的主要效果是避免關於多字節語言環境中的無效輸入和偽匹配的錯誤/警告,但對於regexpr,它會更改輸出的解釋。它禁止具有標記編碼的輸入的轉換,並且如果發現任何輸入被標記為「字節」,則被強制參見編碼)。

無關匹配對多字節語言環境中的字節沒有多大意義,如果useBytes = TRUE,您應該希望它只適用於ASCII字符。

regexpr和gregexpr與perl = TRUE允許Python風格的命名捕獲,但不是長矢量輸入。

當前語言環境中的無效輸入最多警告5次。

對於非ASCII字符,與PERL = TRUE的無符號匹配取決於使用「Unicode屬性支持」編譯的PCRE庫:外部庫可能不是。

如果你正在做很多的正則表達式匹配,包括非常長的字符串,通常將正則表達式引擎設為PCRE,這將將比默認正則表達式引擎快,而fixed = TRUE更快(特別是當每個模式只匹配幾次時)。

 

gregexpr()

返回一個與文本長度相同的列表,每個元素的格式與regexpr的返回值相同,除了給出了每個(不相交)匹配的起始位置。

regexec()

返回與文本相同長度的列表,如果沒有匹配,則返回-1,或者具有匹配的起始位置的整數序列和對應於模式的括號子表達式的所有子串,其中屬性「match .length「給出匹配長度的向量(或沒有匹配的-1)。

                     正則表達式轉義字符   空白元字符[\b]回退(並刪除)一個字符(backspace)\f換頁符\n換行符\r回車符\t制表符(tab)\v垂直制表符註:\r\n是windows所用的文本行結束符,Unix和Linux只是用一個換行符來結束一個文本行匹配數字與非數字\d任何一個數字字符,等價於[0-9]\D任何一個非數字字符,等價於^[0-9]匹配字母\非字母與數字\w任何一個字母數字字符(大小寫均可以)或下劃線字符(等價於[a-zA-Z0-9])\W任何一個非字母數字或下劃線字符(等價於[^a-zA-Z0-9])匹配空白字符\s任何一個空白字符(等價於[\f\n\r\t\v])\S任何一個非空白字符(等價於[^\f\n\r\t\v])POSIX字符類[:alnum:]任何一個字母或數字(等價於[a-ZA-Z0-9])[:alpha:]任何一個字母(等價於[a-ZA-Z])[:blank:]空格或制表符(等價於[\t ])    注:t後面有一個空格[:cntrl:]ASCII控制字符(ASCII  0到31,再加上ASCII 127)[:digit:]任何一個數字(等價於[0-9])[:graph:]和[:print:]一樣,但不包括空格[:lower:]任何一個小寫字母(等價於[a-z])[:print:]任何一個可列印字符[:punct:]既不屬於[:alnum:],也不屬於[:cntrl:]的任何一個字符[:space:]任何一個空格字符,包括空格(等價於[f\n\r\t\v  ] 注:v後面有一個空格[:upper:]任何一個大寫字母(等價於[A-Z])[:xdigit:]任何一個十六進位數字(等價於[a-fA-F0-9])其他.可以匹配任何單個的字符字母數字甚至.字符本身。同一個正則表達式允許使用多個.字符。但不能匹配換行\\轉義字符,如果要匹配就要寫成「\\(\\)」|表示可選項,即|前後的表達式任選一個^取非匹配$放在句尾,表示一行字符串的結束()提取匹配的字符串,(\\s*)表示連續空格的字符串[]選擇方括號中的任意一個(如[0-2]和[012]完全等價,[Rr]負責匹配字母R和r){}前面的字符或表達式的重複次數。如{5,12}表示重複的次數不能小於5,不能多於12,否則都不匹配*匹配零個或任意多個字符或字符集合,也可以沒有匹配+匹配一個或多個字符,至少匹配一次?匹配零個或一個字符

現在來舉幾個例子。

首先使用[]中括號的功能,來查找一下看有沒有do組合的單詞。

text<-c("Don't","aim","for","success","if","you","want","it","just","do","what","you","love",        "and","believe","in","and","it","will","come","naturally")#查找含有DO組合的單詞grep("[Dd]o",text)#不區分大小寫grep("[D]o",text)#D要大寫grep("[d]o",text)#D小寫


運行結果如下:

> text<-c("Don't","aim","for","success","if","you","want","it","just","do","what",
"you","love","and","believe","in","and","it","will","come","naturally")> > #查找含有DO組合的單詞> grep("[Dd]o",text)#不區分大小寫[1] 1 10> grep("[D]o",text)#D要大寫[1] 1> grep("[d]o",text)#D小寫[1] 10

  

郵箱匹配:

#郵箱匹配:text2<-c("704232753@qq.com is my email address.")grepl("[0-9.*]+@[a-z.*].[a-z.*]",text2)

結果如下

> text2<-c("704232753@qq.com is my email address.")> grepl("[0-9.*]+@[a-z.*].[a-z.*]",text2)[1] TRUE

 

說明可以查找到了。

至於其他函數大家可以自己去試試,遇到問題也可以在正則表達必知必會這本書上查閱。順便說一下,在公眾號回復 正則表達式必知必會 即可獲取百度網盤下載連結。

推薦閱讀:

➤R語言怎麼給中文分詞

➤Rwordseg包如何加載本地詞典


相關焦點

  • 正則表達式在VBA中間是如何應用?正則表達式的實現方式?
    Hi,大家好,本章節開始將會從零開始和大家用圖文的方式,讓你從零基礎學會正則表達式!有興趣的小夥伴可以持續關注我,或者在專欄中進行查看自我學習,願與君攜手前行!在上一個章節說到正則表達式的入門級知識點,本節將會與大家分享一下正則表達式的是具體實現方式是怎麼樣的?
  • python正則表達式
    2''' 3正則表達式, 簡稱為 regex, 是文本模式的描述方法。 4''' 5#7.2.1創建正則表達式對象 6''' 7python中所有正則表達式的函數都在re模塊中,向 re.compile()傳入一個字符串值, 8表示正則表達式,它將返回一個 Regex 模式對象(或者就簡稱為 Regex 對象)。
  • Matlab 正則表達式
    正則表達式是一個非常重要的編程概念,主流的程式語言都對正則表達式進行了很好的支持,Matlab也不例外。本期推文就讓我們來總結一下Matlab提供的正則表達式吧!5 動態正則表達式動態表達式允許我們執行 MATLAB 命令或正則表達式以確定要匹配的文本。將動態表達式括起來的括號不創建捕獲組。
  • Python中的正則表達式
    什麼是正則表達式正則表達式是用於處理字符串的強大工具,它使用預定義的特定模式去匹配一類具有共同特徵的字符串,主要用於快速、準確地完成複雜字符串的查找、替換等。正則表達式進行匹配的流程如下圖所示:正則表達式匹配過程是:依次拿出表達式和文本中的字符比較,如果每一個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。
  • VBS正則表達式
    正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配。這裡有一些可能會遇到的正則表達式示例:Visual Basic VBscript. 匹配scripting Edition/^\[ \t]*$/ "^\[ \t]*$" 匹配一個空白行。
  • Python 正則表達式
    最簡單的正則表達式就是普通字符串,可以匹配其自身。比如,正則表達式 『hello』 可以匹配字符串 『hello』。要注意的是,正則表達式並不是一個程序,而是用於處理字符串的一種模式,如果你想用它來處理字符串,就必須使用支持正則表達式的工具,比如 Linux 中的 awk, sed, grep,或者程式語言 Perl, Python, Java 等等。
  • 實戰JS正則表達式
    [新建正則表達式]:var  regexp = /aabb/g; //g可省 var  regexp = new Regexp("xyz","g"); //第二個參數可省區別在於:1.採用字面量的寫法新建的正則表達式對象在代碼編譯時就會生成,是平常開發中常用的方式;2.採用構造函數生成的正則對象要在代碼運行時生成。
  • Python正則表達式總結
    正則表達式 的起源、發展、流派、語法、引擎、優化等相關知識,今天我們主要來學習一下 正則表達式在 Python語言 中的應用!大多數程式語言的正則表達式設計都師從Perl,所以語法基本相似,不同的是每種語言都有自己的函數去支持正則,今天我們就來學習 Python中關於 正則表達式的函數。re模塊主要定義了9個常量、12個函數、1個異常,每個常量和函數豬哥都會通過實際代碼案例講解,讓大家能更直觀的了解其作用!註:為避免出現代碼格式錯亂,豬哥儘量使用代碼截圖演示哦。
  • 正則表達式替換函數
    導讀在上篇推文《正則表達式匹配和提取函數》中簡單介紹了正則表達式的匹配和提取函數,並用一些簡單的例子向大家說明如何利用正則表達式匹配和提取文本。
  • 正則表達式基礎筆記
    正則表達式定義正則表達式聲明1.普通方式
  • 刨根究底正則表達式(1):開篇
    正則表達式目前市面上並不缺乏專業著作,比如那本被譽為正則表達式學習聖經的《精通正則表達式》就很值得一讀,另外該書的譯者餘晟先生所寫的《正則指引》也不錯。如果僅用於入門,則《正則表達式必知必會》肯定不能錯過,還有網上流傳極廣的《正則表達式30分鐘入門教程》也是不錯的入門資料。但是,結合我自身痛苦的正則表達式學習經歷和運用體會,僅有這些是遠遠不夠的。
  • JavaScript高級什麼是正則以及正則表達式的簡單運用
    在實際開發中 ,經常會用到一些表單的驗證 ,提交表單的時候一般都會預校驗 ,比如手機號填寫是否合格 ,用戶暱稱填寫是否規範等 ,這些就要用到正則表達式什麼是正則表達式?用於匹配規律規則的表達式,正則表達式最初是科學家對人類神經系統的工作原理的早期研究,現在在程式語言中有廣泛的應用。正則表通常被用來檢索、替換那些符合某個模式(規則)的文本。
  • Perl教程 - 正則表達式
    ,它與Tcl等語言中的正則表達式有一定的相似之處,因此如果學習過相關正則表達式的話這個不會很難。https://wenku.baidu.com/view/baa401f5dd88d0d233d46ab5.html正則表達式的三種形式:    首先我們應該知道Perl程序中,正則表達式有三種存在形式,他們分別是:匹配:m/<regexp>/(還可以簡寫為/<regexp>/,略去m)替換:s/&
  • 正則表達式語法
    原子是正則表達式中最基本的組成單位,每個正則表達式中至少包含一個原子。
  • 看完你就會正則表達式了
    最近看了一篇關於正則表達式的學習筆記,覺得講的非常好,更有圖形化的神器相助,想不學會都難,所以想轉給大家看看。話說不是開發為啥要學正則表達式這種看似很晦澀的東西呢,因為現在很多搜索的場景都是支持正則表達式的,學會了正則表達式就有如一把利劍在手。本文較長,建議抽40分鐘完整的時間一次讀完再慢慢消化。
  • Oracle 正則表達式(一)
    Oracle的正則表達式(regular expression)簡單介紹目前,正則表達式已經在很多軟體中得到廣泛的應用
  • Java 正則表達式教程及示例
    本教程旨在幫助你駕馭Java正則表達式,同時也幫助我複習正則表達式。什麼是正則表達式?正則表達式定義了字符串的模式。正則表達式可以用來搜索、編輯或處理文本。正則表達式並不僅限於某一種語言,但是在每種語言中有細微的差別。Java正則表達式和Perl的是最為相似的。
  • 給JAVA程式設計師的正則表達式一課
    「不會正則表達式,就算寫遍代碼也嘛不是」。說到正則表達式,可能動態語言的碼農Perl,Python,JS甚至是Golang的開發人員可能都熟悉。對Java碼農來說,可能CURD手到擒來,Spring Stuts Hibernat耳聞能詳,但是說到Regex RE模式,可能熟練的少。那麼,今天蟲蟲就來給廣大Java碼農來補補正則的課。
  • Python正則表達式急速入門
    正則表達式在程序開發中會經常用到,比如數據(格式)驗證、替換字符內容以及提取字符串內容等等情況都會用到,但是目前許多開發人員對於正則表達式只是處於了解或者是基本會用的階段。一旦遇到大批量使用正則表達式的情況(例如網絡爬蟲)可以說基本上就抓瞎了。這篇文章我將帶領大家利用 Python 來學習一下正則表達式。
  • 正則表達式入門教程 + 免費在線正則測試工具推薦
    正則表達式在計算機領域幾乎無所不在,但它又很難掌握,新手容易犯暈。如果你還處於入門學習階段,單靠腦子憑空寫一些複雜的正則,很難保證準確性,後面往往要花費大量時間去調試。其實,藉助一些可視化的正則測試工具網站,不僅能節省大量時間,還能對正則有更深的理解……什麼是正則表達式?