1. 程式人生 > 其它 >view函式_資料科學系列:資料處理(6)字串函式基於R(二)

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")

c8721d9c6ec2ac2fb8a143feb4907a40.png

匹配字串向量中的"lash":

85616c0f7173c49b8e90b2d070f1d5b5.png

4.2.2 轉義符

字串中元字元、限定符或者關鍵詞都是有特殊含義的,匹配的時候需要轉化成普通字元,只需在前面加上"\"即可。

text1 

我們想匹配字串中的".",如果直接用完全匹配:

str_view(text1, ".")

ddacb29c60726310ecff31a928361e27.png

為什麼匹配到的是"F"呢?因為"."是元字元,要想匹配到普通字元".",需要使用"\"將其轉義成普通字元,若使用"\."匹配,結果會是怎麼樣呢?

str_view(text1, "\.")

3ce437272fc020c1938bd8e876587ae3.png

會報錯,是因為\也是特殊符號,也需要使用\進行轉義,因此想要匹配到普通字元".",正確的應該去匹配"\\."

str_view(text1, "\\.")

979e5a8382cedb47ec45dde5c1f37696.png

如果在使用正則表示式的過程中,發現匹配到並不是你想要的結果,一檢查匹配規則是否正確,二是看下你想要匹配的字元是否為一些特殊符號,需要進行轉義,三是貪婪匹配還是懶惰匹配。

4.2.3元字符合反義符

元字元是正則表達是的最基本元素,匹配某個字元,反義符是取反的意思。

06e2245e8a025fcd061956a789c66b73.png

"."元字元

"."匹配除換行符\n以外的所有字元

text2 str_view(text2, ".")

6e2c95b5948585b0d0d7e8470fa46636.png

匹配以"l"開始和"h"結束的字元:

str_view(text2, "l..h")

c1d377269ed1d2a682ecd6b7f47564a4.png

"\w"和"\W"

"\w"用於匹配匹配字母、數字、漢字以及空格下劃線等;而"\W"用於匹配非"\w"的。

str_view(text2, "\\w")

337e717c10f0635e554dca5330279005.png

str_view(text2, "\\W")

fcb3f37e4ceef35f2f033cc744d3be3b.png

"\s"與"\S"

"\s"用於匹配空白符,而"\S"用於非"\s"。

str_view(text2, "\\s")

8b95d2839db8942fd73e1124c88fe6ab.png

str_view(text, "\\S")

19099eb2fb0ae7cc9d411bcb27dcc940.png

"\d"與"\D"

"\d"用於匹配數字,而"\D"用於匹配非"\D".

str_view(text2, "\\d")

8a877cef18c5fd90108822673a6010b3.png

str_view(text2, "\\D")

9e6d6c8d9664a46cfdfb77c5b4288956.png

"\b"、"\B"、"^"、"$"

"\b"用於匹配字串的開始或者結束,字串的邊界,而"\B"用於非字串的邊界。

"^"用於匹配字串的開始,"$"用於匹配字串的結束。

text3 

匹配text3字串向量以"h"開始的字串:

str_view(text3, "\\bh")

60da3e48dada3a4066a026209fc303a0.png

等價於

str_view(text3, "^h")

309bbae9e32cf6d544bab1983f826902.png

匹配text3字串向量以"h"開結束的字串:

str_view(text3, "h\\b")

a0f464aae1934bfb32a485123ecf6dac.png

等價於

str_view(text3, "h$")

2833d865c802dc940b3e5bbd8a8c23fe.png

4.2.4 重複量詞

元字元是正則表示式的最基本元素,要想匹配多個元字元,例如匹配QQ號是8位數字的QQ的,使用元字元可以寫成^\\d\\d\\d\\d\\d\\d\\d\\d$,是不是發現很不簡潔,而且容易出錯,為了處理類似的重複性問題,正則表示式中有一些重複量詞,把重複部分用合適的量詞替代。

d16d62c345a5246a313729397e0719fc.png

"*"與"+"重複量詞

注意"*"和"+"的區別:"*"匹配0次或者多次;"+"匹配1次或者多次。

text4 

匹配以數字開始且連續幾位都是數字:

str_view(text4, "^\\d*")

506d194e23b7f29886d6c5b496e25ebe.png

str_view(text4, "^\\d+")

cfb9c6dbb706e5c5b98cc1f9e565556b.png

"?"重複量詞

這裡涉及到貪婪和懶惰匹配。

貪婪匹配:通常正則表示式中包含能接受重複的限定符時,通常是匹配儘量多的字元,稱之為貪婪匹配。

懶惰匹配:希望匹配儘可能少的字元,需要使用"?"限制,只需要在限定符後面加上"?"。

例如:匹配以a開頭,以b結束的字串:

str_view(text4, "^a.*b")

277b777ce0951300805f856566e9e0b2.png

str_view(text4, "^a.*?b")

739d8f8b1666d5edc1d20eb7a966e04d.png

{n}、{n,}與{n,m}重複量詞

{n}:前面元素剛好重複n次;

{n,}:前面元素至少重複n次;

{n,m}:前面元素至少重複n次,最多重複m次;

匹配text4中,剛好是8個數字的字串:

str_view(text4, "^\\d{8}$")

889104e1f62e887da97e7ffbb5060d9f.png

匹配text4,含有至少8個數字的字串:

str_view(text4, "\\d{8,}")

ab34fc593b8983b0235deb73fec6a1fb.png

這裡可以執行一下str_view(text4, "\\d{8,}?"),加深對貪婪和懶惰匹配的理解。

匹配text4中,含有8-9位數字的字串:

str_view(text4, "\\d{8,9}")

214aced5065bea4b33b4c18bfbcf801d.png

4.2.5 分組和條件或

上面重複量詞都是重複前面的一個元素,那麼如果我們想重複前面兩個元素,即需要將前面兩個元素作為一個整體。正則表示式中使用()來做分組,把括弧中的元素當做一個整體。

匹配以ab開頭的字串:

str_view(text4, "^(ab)+")

0c6534bb79941ba40a9a630a33ee8819.png

問題又來了,如果想匹配以a開頭或者以b開頭的字串,總不能寫兩個匹配模式吧。正則表示式中使用"|"來表示或(或使用中括號[]),也叫做分支條件,滿足分支條件中的任意一種條件時,都會成功匹配。

匹配以字母a或者b開頭的字串:

str_view(text4, "^(a|b)+")

f557b93db108a85e761651a2601f6b2d.png

等價於

str_view(text4, "^[ab]+")

30911b23f677372561f0f76d5e321fa5.png

4.2.6 R語言正則表示式總結

正則表示式部分比較晦澀,看書的時候在這個部分花了很長時間,理解這一塊,最好是理論結合練習,多寫一下案例,下面會接著介紹stringr包中的使用正則表示式的字串處理函式。