同样,先先加载包
library(tidyverse)
## -- Attaching packages ---------------------------------------------------------------------- tidyverse 1.2.1 --
## v ggplot2 3.1.1 v purrr 0.3.2
## v tibble 2.1.1 v dplyr 0.8.0.1
## v tidyr 0.8.3 v stringr 1.4.0
## v readr 1.3.1 v forcats 0.4.0
## -- Conflicts ------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(stringr)
我们先来看一个例子。 用stringr包中的str_view函数来看一下匹配的含义。
x <- c("apple", "banana", "pear")
str_view(string = x, pattern = "an")
可以看到该函数将字符串中含有an的对象banana找出来了。这可以算作是精确匹配,那么如果我们想要匹配的是符合一定规律的怎么办呢?比如想要匹配中间为字母a,前后为任意字符皆可。这就用到正则表达式了,维基百科定义如下:
正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE),又称正规表示、正规表示法、正规表达式、规则表达式、常规表示法,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。
比如刚才的例子,就可以这么写:
x <- c("apple", "banana", "pear")
str_view(string = x, pattern = ".a.")
其中的“.”,就代表着任意字符,注意任意,也就是不管是字母,数字,符号,空格等等,都是可以的。但是问题来了,如果我们需要的是精确匹配“.”本身呢,这时候需要使用反斜杠 “\”对其进行转义,这时候正字表达式就不会将其视作广义的代表,而是该字符本身了。但是因为\本身在正则表达式中也有其特殊含义,因此他也需要一个反斜杠对其进行转义,也就是说,如果我们想匹配.,我们需要这么写,\\.,也就是两个反斜杠。我们举个例子:
x <- c("abc", "a.c", "bef")
str_view(string = x, pattern = "a\\.c")
可以看到这样就可以把点本身精确匹配到了。
那么如果想要匹配```本身呢?需要4个反斜杠。。。因为首先反斜杠出现在字符串中就需要对其进行转义,也就是说表示为一个反斜杠就需要2个,所以,最后就出现了四个反斜杠。另外,最近在看python,python中有原生字符串的概念,所以对于出现反斜杠的字符串,可以直接使用r,就不怕漏掉反斜杠了。
x <- "a\\b"
writeLines(x)
## a\b
#> a\b
str_view(string = x, pattern = "\\\\")
那么如果要匹配"'\,该怎么写呢?例子如下:
x <- "aa\"\'\\"
writeLines(x)
## aa"'\
#> a\b
str_view(string = x, pattern = "\"\'\\\\")
比如你想匹配开头或者结尾为固定内容的对象,在正则表达式中,也有固定符号进行表示。
^表示开头。$表示结尾。匹配以字母a开头的对象:
x <- c("apple", "banana", "pear")
str_view(string = x, pattern = "^a")
匹配以字母a结尾的对象:
x <- c("apple", "banana", "pear")
str_view(string = x, pattern = "a$")
注意两个符合的位置。
如果想要精确匹配某个字符,这两个特殊夫就非常有用了:
x <- c("apple pie", "apple", "apple cake")
str_view(string = x, pattern = "apple")
str_view(string = x, pattern = "^apple$")
如果想要精确匹配对象$^$,那么该怎么写呢?
x <- c("$^$", "apple", "$^$a")
str_view(string = x, pattern = "\\$\\^\\$$")
string包中有一个单词库,我们可以用它来联系一下,比如,匹配该单词库中所有以x开头的单词:
x <- stringr::words
str_view(string = x, pattern = "^x", match = TRUE)
匹配所有以y结尾的单词:
x <- stringr::words
str_view(string = x, pattern = "y$", match = TRUE)
匹配所有长度为3的对象,注意不可以使用str_length函数
x <- stringr::words
str_view(string = x, pattern = "^...$", match = TRUE)
匹配所有长度为7及以上的对象,注意同样不可以使用str_length函数
x <- stringr::words
str_view(string = x, pattern = "^.......", match = TRUE)
从上面可以看出来,其实正则表达式就是特殊字符的组合,用来表示符合规定的对象,因此特殊字符就尤为重要,我们下面来看看都有哪些特殊字符。
\d:表示任意数字,d就是digit的意思。\s:表示任意空白,比如空格,tab等。[abc]:中括号将里面包含的内容,表示任意一个即可,比如[abc]代表的就是a,b或者c。[^abc]:这表示的是除了a,b和c之外的任意字符。同样的,记住,只要反斜杠出现,就要同时出现两个。
写到这里,电脑没电了,又忘了带带能源,那就正好明天一起,把特殊字符写完。