常见函数
trimws(x)删去字符型向量x的每个元素的开头和结尾的所有空格。加选项which=’left’可以仅删去开头的空格, 选项which=’right’可以仅删去结尾的空格。
trimws(c(" 李明", "李明 ", " 李明 ", "李 明"))
## [1] "李明" "李明" "李明" "李 明"
sprintf是C语言中sprintf的向量化版本,可以把一个元素或一个向量的各个元素按照C语言输出格式转换为字符型向量。
sprintf('tour%02d.jpg', 1:10)
## [1] "tour01.jpg" "tour02.jpg" "tour03.jpg" "tour04.jpg" "tour05.jpg"
## [6] "tour06.jpg" "tour07.jpg" "tour08.jpg" "tour09.jpg" "tour10.jpg"
substring函数求字符串字串, 用开始字符位置和结束字符位置设定字串位置。
substring(c("123456789", "abcdefg"), 3, 5)
## [1] "345" "cde"
用gsub(pattern, replacement, x, fixed=TRUE) 把字符型向量x中每个元素中出现的子串 pattern都替换为replacement。
gsub('the', '**',
c('New theme', 'Old times', 'In the present theme'),
fixed=TRUE)
## [1] "New **me" "Old times" "In ** present **me"
strsplit(x,split,fixed=TRUE)可以把字符型向量x的每一个元素按分隔符split拆分为一个字符型向量, strsplit的结果为一个列表, 每个列表元素对应于x的每个元素。
strsplit('31,32,33,34', split=',', fixed=TRUE)[[1]]
## [1] "31" "32" "33" "34"
正则表达式
在正则表达式的模式(pattern)中,
.*+?{}[]^$()
等字符是特殊字符, 除了’'之外的其它12个都称为“元字符”(meta characters)。
regexpr函数的一般用法为:
regexpr(pattern, text, ignore.case = FALSE, perl = FALSE, fixed = FALSE, useBytes = FALSE)
x <- c('New theme', 'Old times', 'In the present theme')
grep('the', x, perl=TRUE)
## [1] 1 3
grep('the', x, perl=TRUE, value=TRUE)
## [1] "New theme" "In the present theme"
正则表达式的模式一般是区分大小写的。 为了不区分大小写匹配, 可以在grep等函数调用时加选项ignore.case=TRUE
grep('dr', c("Dr. Wang", 'DR. WANG', 'dR. W.R.'), ignore.case=TRUE, value = TRUE)
## [1] "Dr. Wang" "DR. WANG" "dR. W.R."
在模式中用“.”匹配任意一个字符,用“[.]”表示句点则将句点不做特殊解释,也可以使用“.”表示
grep('a.txt', c('a.txt', 'a0txt'), perl=TRUE)
## [1] 1 2
grep('a[.]txt', c('a.txt', 'a0txt'), perl=TRUE)
## [1] 1
grep('a\\.txt', c('a.txt', 'a0txt'), perl=TRUE)
## [1] 1
匹配空白,表示空白的元字符有:
\f 换页符
\n 换行符
\r 回车符
\t 制表符
\v 垂直制表符
不同操作系统的文本文件的行分隔符不同, 为了匹配Windows格式的文本文件中的空行, 用“”; 为了匹配Unix格式的文本文件中的空行则用“”。写成R的字符型常量时, 这些表示本身也是R的相应字符的表示,所以在R字符型常量中这些字符不需要用两个。
匹配任意一个空白字符用“”, 这等价于“[ ]”。 大写的“”则匹配任意一个非空白的字符。
用,相当于[0-9]。 用。
grep("n\\d[.]xls", c("n1.xls", "na.xls"), perl=TRUE, value = T)
## [1] "n1.xls"
模式匹配相当于在字符串内部搜索某种模式, 如果要从字符串开头匹配, 在模式中取第一个字符为^或。 如果模式中最后一个字符是$或, 则需要匹配到字符串末尾。
匹配字母、数字、下划线字符用, 等价于[a-zA-Z0-9_]。 。
m <- regexpr("s\\w[.]", c("file-s1.xls", "s#.xls"), perl=TRUE)
regmatches(c("file-s1.xls", "s#.xls"), m)
## [1] "s1."
m <- regexpr("s\\W[.]", c("file-s1.xls", "s#.xls"), perl=TRUE)
regmatches(c("file-s1.xls", "s#.xls"), m)
## [1] "s#."
模式中在一个字符或字符集合后加后缀+表示一个或多个前一字符。
s <- c("sa1", "dsa123")
mres <- regexpr("sa[[:digit:]]+", s, perl=TRUE)
regmatches(s, mres)
## [1] "sa1" "sa123"
在模式中方括号内可以用[:digit:] 表示任意一个字母。 比如,[[:digit:]]匹配任意一个字母(外层的方括号表示字符集合,内层的方括号是POSIX字符类的固有界定符)
在一个字符或字符集合后加后缀*表示零个或多个前一字符,后缀?表示零个或一个前一字符。
问号可以表示零个或一个, 而加号、星号重复不能控制重复次数。在后缀大括号中写一个整数表示精确的重复次数。
grep('[[:digit:]]{3}', c('1', '12', '123', '1234'), value = TRUE)
## [1] "123" "1234"
贪婪匹配和懒惰匹配
无上限的重复匹配如’*, +, {3,}’ 等缺省是贪婪型的, 重复直到文本中能匹配的最长范围。
如果要求尽可能短的匹配, 使用’*?, +?, {3,}?’等“懒惰型”重复模式。 在无上限重复标志后面加问号表示懒惰性重复。
s <- '<B>1st</B> other <B>2nd</B>'
p1 <- '<[Bb]>.*</[Bb]>'
m1 <- regexpr(p1, s, perl=TRUE)
regmatches(s, m1)[[1]]
## [1] "<B>1st</B> other <B>2nd</B>"
s <- '<B>1st</B> other <B>2nd</B>'
p2 <- '<[Bb]>.*?</[Bb]>'
m2 <- regexpr(p2, s, perl=TRUE)
regmatches(s, m2)[[1]]
## [1] "<B>1st</B>"
最后一次修改于 2018-12-27