view函数_数据科学系列:数据处理(6)字符串函数基于R(二)
承接R&Python Data Science系列:數據處理(5)--字符串函數基于R(一),繼續介紹R語言中的字符串函數。
4.2?R語言中的正則表達式
? ? 正則表達式通過各種函數對字符串進行查詢,是一種特殊的字符串模式,定義一組規則去匹配符合該規則的字符。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包中的使用正則表達式的字符串處理函數。
總結
以上是生活随笔為你收集整理的view函数_数据科学系列:数据处理(6)字符串函数基于R(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python运行一个项目_Django
- 下一篇: 怎么样设置关闭网页再次登录网页是正常登录