view函式_資料科學系列:資料處理(6)字串函式基於R(二)
技術標籤:view函式替代字串的某個字元特殊符號會被當做字串嗎
承接R&Python Data Science系列:資料處理(5)--字串函式基於R(一),繼續介紹R語言中的字串函式。
4.2R語言中的正則表示式
正則表示式通過各種函式對字串進行查詢,是一種特殊的字串模式,定義一組規則去匹配符合該規則的字元。R語言中stringr包中用到的ICU(http://userguide.icu-project.org/posix)正則表示式,這裡簡單介紹一下常用到的正則表示式,簡單分為下面幾種:
完全匹配
轉義符
元字元與反義符
重複量詞
分組與條件或
為了顯示字串中字元函式是怎麼匹配的,這裡使用str_view()函式進行講解。
4.2.1完全匹配
library(stringr)library(htmltools)library(htmlwidgets)text
匹配text字串向量中的"a":
str_view(text, "a")
匹配字串向量中的"lash":
4.2.2 轉義符
字串中元字元、限定符或者關鍵詞都是有特殊含義的,匹配的時候需要轉化成普通字元,只需在前面加上"\"即可。
text1
我們想匹配字串中的".",如果直接用完全匹配:
str_view(text1, ".")
為什麼匹配到的是"F"呢?因為"."是元字元,要想匹配到普通字元".",需要使用"\"將其轉義成普通字元,若使用"\."匹配,結果會是怎麼樣呢?
str_view(text1, "\.")
會報錯,是因為\也是特殊符號,也需要使用\進行轉義,因此想要匹配到普通字元".",正確的應該去匹配"\\."
str_view(text1, "\\.")
如果在使用正則表示式的過程中,發現匹配到並不是你想要的結果,一檢查匹配規則是否正確,二是看下你想要匹配的字元是否為一些特殊符號,需要進行轉義,三是貪婪匹配還是懶惰匹配。
4.2.3元字符合反義符
元字元是正則表達是的最基本元素,匹配某個字元,反義符是取反的意思。
"."元字元
"."匹配除換行符\n以外的所有字元
text2 str_view(text2, ".")
匹配以"l"開始和"h"結束的字元:
str_view(text2, "l..h")
"\w"和"\W"
"\w"用於匹配匹配字母、數字、漢字以及空格下劃線等;而"\W"用於匹配非"\w"的。
str_view(text2, "\\w")
str_view(text2, "\\W")
"\s"與"\S"
"\s"用於匹配空白符,而"\S"用於非"\s"。
str_view(text2, "\\s")
str_view(text, "\\S")
"\d"與"\D"
"\d"用於匹配數字,而"\D"用於匹配非"\D".
str_view(text2, "\\d")
str_view(text2, "\\D")
"\b"、"\B"、"^"、"$"
"\b"用於匹配字串的開始或者結束,字串的邊界,而"\B"用於非字串的邊界。
"^"用於匹配字串的開始,"$"用於匹配字串的結束。
text3
匹配text3字串向量以"h"開始的字串:
str_view(text3, "\\bh")
等價於
str_view(text3, "^h")
匹配text3字串向量以"h"開結束的字串:
str_view(text3, "h\\b")
等價於
str_view(text3, "h$")
4.2.4 重複量詞
元字元是正則表示式的最基本元素,要想匹配多個元字元,例如匹配QQ號是8位數字的QQ的,使用元字元可以寫成^\\d\\d\\d\\d\\d\\d\\d\\d$,是不是發現很不簡潔,而且容易出錯,為了處理類似的重複性問題,正則表示式中有一些重複量詞,把重複部分用合適的量詞替代。
"*"與"+"重複量詞
注意"*"和"+"的區別:"*"匹配0次或者多次;"+"匹配1次或者多次。
text4
匹配以數字開始且連續幾位都是數字:
str_view(text4, "^\\d*")
str_view(text4, "^\\d+")
"?"重複量詞
這裡涉及到貪婪和懶惰匹配。
貪婪匹配:通常正則表示式中包含能接受重複的限定符時,通常是匹配儘量多的字元,稱之為貪婪匹配。
懶惰匹配:希望匹配儘可能少的字元,需要使用"?"限制,只需要在限定符後面加上"?"。
例如:匹配以a開頭,以b結束的字串:
str_view(text4, "^a.*b")
str_view(text4, "^a.*?b")
{n}、{n,}與{n,m}重複量詞
{n}:前面元素剛好重複n次;
{n,}:前面元素至少重複n次;
{n,m}:前面元素至少重複n次,最多重複m次;
匹配text4中,剛好是8個數字的字串:
str_view(text4, "^\\d{8}$")
匹配text4,含有至少8個數字的字串:
str_view(text4, "\\d{8,}")
這裡可以執行一下str_view(text4, "\\d{8,}?"),加深對貪婪和懶惰匹配的理解。
匹配text4中,含有8-9位數字的字串:
str_view(text4, "\\d{8,9}")
4.2.5 分組和條件或
上面重複量詞都是重複前面的一個元素,那麼如果我們想重複前面兩個元素,即需要將前面兩個元素作為一個整體。正則表示式中使用()來做分組,把括弧中的元素當做一個整體。
匹配以ab開頭的字串:
str_view(text4, "^(ab)+")
問題又來了,如果想匹配以a開頭或者以b開頭的字串,總不能寫兩個匹配模式吧。正則表示式中使用"|"來表示或(或使用中括號[]),也叫做分支條件,滿足分支條件中的任意一種條件時,都會成功匹配。
匹配以字母a或者b開頭的字串:
str_view(text4, "^(a|b)+")
等價於
str_view(text4, "^[ab]+")
4.2.6 R語言正則表示式總結
正則表示式部分比較晦澀,看書的時候在這個部分花了很長時間,理解這一塊,最好是理論結合練習,多寫一下案例,下面會接著介紹stringr包中的使用正則表示式的字串處理函式。