R 正则表达式

前言

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

  • 1、扩展正则表达式:默认方式
  • 2、Perl风格正则表达式:设置参数perl = TRUE
  • 3、字面意义正则表达式:设置参数fixed = TRUE,使用的字面意义上的正则表达式

基本字符

R中的元字符包括:

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

这些字符的含义与Python一样

  • .: 表示任意字符,包括换行符
  • \: 对字符进行转义
  • |: A|BAB其中一个匹配,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 的正则看起来是不是很得心应手。

正则表达式速查表

image.png

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

image.png
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270