前言
R
中的正则表达式模式有三种
- 1、扩展正则表达式:默认方式
- 2、
Perl
风格正则表达式:设置参数perl = TRUE
- 3、字面意义正则表达式:设置参数
fixed = TRUE
,使用的字面意义上的正则表达式
基本字符
R
中的元字符包括:
. \ | ( ) [ ] ^ $ * + ?
这些字符的含义与Python
一样
-
.
: 表示任意字符,包括换行符 -
\
: 对字符进行转义 -
|
:A|B
对A
或B
其中一个匹配,A
匹配成功则不匹配B
-
()
: 字符组,括号中的模式作为一个整体进行匹配 -
[]
: 字符集合 -
^
: 匹配字符串开头,在[^6]
表示取反,所有不是6
的字符 -
$
: 匹配字符串结尾
数量词
-
*
: 前一个规则匹配0或无限次 -
+
: 前一个规则匹配1或无限次 -
?
: 前一个规则匹配0或1次 -
{m}
: 前一个规则匹配m次 -
{m,n}
: 前一个规则匹配m~n次,尽可能多 -
{m,}
: 前一个规则匹配m次以上,尽可能多
非贪婪模式
- 上述数量词后加
?
,匹配到满足规则的字符尽量少
实例
下面实例使用grepl
函数
grepl <- function (pattern, x, ignore.case = FALSE, perl = FALSE, fixed = FALSE,
useBytes = FALSE)
{
if (!is.character(x))
x <- as.character(x)
.Internal(grepl(as.character(pattern), x, ignore.case, FALSE,
perl, fixed, useBytes, FALSE))
}
"""
@argument:
pattern: 匹配规则
x: 需要去匹配的字符串
ignore.case: 忽略大小写
perl: perl 语言的匹配模式
fixed: 使用的字面意义上的正则表达式
useBytes: 匹配字节
@return
匹配成功返回 TRUE,否则返回 FALSE
"""
1、符号 .
grepl('ab.', 'abc')
# out: TRUE
grepl('abc', 'Abc', ignore.case = TRUE)
# out: TRUE
grepl('ab.*', 'abcdba', fixed = T)
# out: FALSE
2、反斜杠 \
R
中的反斜杠和Python
中反斜杠会有所区别
R
中定义的转义字符串有:
'\n': 换行
'\r': 回车
'\t': 制表符
'\b': 退格
'\a': 响铃
'\f': 换页
'\v': 垂直制表符
'\\': 反斜杠
'\'': 单引号
'\"': 双引号
'\`': 反引号
'\nnn': 八进制字符(1~3位置的n为八进制数字)
'\xnn': 十六进制字符(1~2位置的n为十六进制数字)
'\unnnn': 十六进制字符(1~4)
'\Unnnnnnnn': 十六进制字符(1~8)
如果反斜线后的转义字符串不在上表范围内,系统就会报错.
要在字符常量中输入反斜线,需要输入两个反斜线,即 \\
grepl('ab\\[', 'ab[]')
# out: TRUE
grepl('ab\\\\', 'ab\\')
# out: TRUE
grepl('ab\.', 'ab.')
# Error: 由"'ab\."开头的字符串中存在'\.',但没有这种逸出号
3、析取 |
grepl('ab|c', c('ab', 'ac', 'a'))
# out: TRUE TRUE FALSE
4、组合 ()
grepl('(a.)+c', c('ac', 'acc'))
# out: FALSE TRUE
反向引用,只能在使用小括号是才能使用
grepl('c(..) s\\1', c('cat sat', 'cat saa'))
# out: TRUE FALSE
5、字符集合 []
grepl('[Tt]he', c('the', 'The'))
# out: TRUE TRUE
# 范围:a-z 表示 26 个小写字母
grepl('[a-z]he', c('the', 'she', 'The'))
# out: TRUE TRUE FALSE
# 取反,所有不是 t 的字符
grepl('[^t]he', c('the', 'she', 'The'))
# out: FALSE TRUE TRUE
# 特殊字符失去特殊含义,. 不再表示任意字符
grepl('[.]he', c('the', '.he'))
# out: FALSE TRUE
6、边界 ^ $
grepl('[Tt]he', c('the', 'The', 'other'))
# out: TRUE TRUE TRUE
grepl('^[Tt]he', c('the', 'The', 'other'))
# out: TRUE TRUE FALSE
grepl('[Tt]he$', c('the', 'The', 'other'))
# out: TRUE TRUE FALSE
7、数量词 * + ? {}
grepl('.*', 'abcdba')
# out: TRUE
grepl('.*', '')
# out: TRUE
grepl('.+', 'abcdba')
# out: TRUE
grepl('.+', '')
# out: FALSE
grepl('ab?', 'a')
# out: TRUE
grepl('ab?', 'ab')
# out: TRUE
grepl('ab{3}', 'abbb')
# out: TRUE
grepl('ab{3}', 'abb')
# out: FALSE
grepl('ab{3,5}', 'abbbb')
# out: TRUE
grepl('ab{3, }', 'abbbb
grepl('ab{3, }', 'abbbb')
grepl('ab{3,}', 'abbbb')
grepl('ab{,4}', 'abbbb')
# out: TRUE
非贪婪模式
sub<-function (pattern, replacement, x, ignore.case = FALSE, perl = FALSE,
fixed = FALSE, useBytes = FALSE)
{
if (!is.character(x))
x <- as.character(x)
.Internal(sub(as.character(pattern), as.character(replacement),
x, ignore.case, perl, fixed, useBytes))
}
"""
sub 函数 与 grepl 函数参数基本一致
将匹配到的字符串替换为 replacement 参数指定的数据
"""
sub('ab{3,8}', '', 'abbbbbbbc')
# out: 'c'
sub('ab{3,8}?', '', 'abbbbbbbc')
# out: 'bbbbc'
有了 Python
正则的铺垫,R
的正则看起来是不是很得心应手。
正则表达式速查表
stringr 速查表,里面也有正则表达式的内容