R语言编程进阶RR语言

R 正则表达式

2021-02-16  本文已影响0人  名本无名

前言

R中的正则表达式模式有三种

基本字符

R中的元字符包括:

 . \ | ( ) [ ] ^ $ * + ?

这些字符的含义与Python一样

数量词

非贪婪模式

实例

下面实例使用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 的正则看起来是不是很得心应手。

正则表达式速查表

image.png

stringr 速查表,里面也有正则表达式的内容

image.png image.png
上一篇下一篇

猜你喜欢

热点阅读