R语言正则表达式基础

一、背景

正则表达式,是根据字符串规律按一定法则,简洁表达一组字符串的表达式。正则表达式通常就是从貌似无规律的字符串中发现规律性,进而概括性地表达它们所共有的规律或模式,以方便地操作处理它们,这是真正的化繁为简,以简御繁的典范。

几乎所有的高级编程语言都支持正则表达式,正则表达式广泛应用于文本挖掘、数据预处理,例如:

  • 检查文本中是否含有指定的特征词
  • 找出文本中匹配特征词的位置
  • 从文本中提取信息
  • 修改文本

正则表达式包括:只能匹配自身的普通字符(如英文字母、数字、标点等)和被转义了的特殊字符(称为‘‘元字符’’)。

二、基本语法

2.1 常见元字符

请添加图片描述

2.2 特殊字符与反义

请添加图片描述
示例:

\\S+:匹配不包含空白字符的字符串
\\d:匹配数字
[a-zA-Z0-9]:匹配字母和数字
[\u4e00-\u9fa5]:匹配汉字

2.3 运算优先级

  1. 首先,圆括号括起来的表达式最优先
  2. 其次,表示重复次数的操作(即* + { })
  3. 再次,连接运算(即几个字符放在一起,如abc)
  4. 最后,或运算(|)

另外,正则表达式还有若干高级用法,常用的有零宽断言分组捕获

2.4 示例

在R语言中,使用正则表达式的方式:library(stringr)
常见的操作是:

  • 若仅调试和查看正则表达式的效果,使用:str_viewstr_view_all(),将在原字符向量中高亮显示匹配的内容
  • 若要提取正则表示式内容,使用str_extract()str_extract_all(),将提取匹配的第一个或者提取所有的匹配内容。
  • 若是替换正则表达式内容,使用str_replacestr_replace_all(),将替换匹配的第一个或者替换所有的匹配内容
示例1:直接匹配
> x = c("CDK 弱(+)10%+", "CDK(+)30%-", "CDK(-)0+", "CDK(++)60%*")
> str_view(x, "\\d+%")

请添加图片描述

示例2:零宽断言,匹配两个标志之间的内容

解决的问题:适合想要匹配的内容没有规律性,但该内容位于两个有规律性的标志之间,标志也可以是开始和结束。

引导语法:通常想要匹配的内容 不包含两边的 “标志” ,这就需要用零宽断言。简单来说,就是一种引导语法告诉既要匹配到 "标志",但又不包含 "标志"。左边标志的引导语法是 (?<= 标志),右边标志的引导语法是 (?= 标志),而 真正要匹配的内容放在它们中间

> x = c("175.10.237.40(湖南-长沙)", "114.243.12.168(北京-北京)",
+       "125.211.78.251(黑龙江-哈尔滨)")
> str_extract(x, "\\(.*-")
# [1] "(湖南-"   "(北京-"   "(黑龙江-"
> str_extract(x, "(?<=\\().*(?=-)")
[1] "湖南"   "北京"   "黑龙江"
示例3:惰性匹配:尽可能短的匹配

贪婪匹配:几乎所有的高级语言的正则表达式在进行匹配时,均为贪婪匹配,即匹配字符串所能满足匹配的最长范围。
惰性匹配:在满足正则表达式匹配的过程中,匹配字符串所能满足匹配的最短范围

# 贪婪匹配
> str_extract("(lsit) (order)  (test)", "\\(.+\\)")
[1] "(lsit) (order)  (test)"

# 惰性匹配,通过在元字符后面添加 ? 来执行惰性匹配
> str_extract("(lsit) (order)  (test)", "\\(.+?\\)")
[1] "(lsit)"
示例4:捕获分组

正则表达式中可以用圆括号分组,作用是

  • 确定优先规则
  • 组成一个整体
  • 拆分出整个匹配中的部分内容(称为捕获)
  • 捕获内容供后续引用或者替换。
> x = c("宝马X3 2016 款", "大众速腾2017 款", "宝马3 系2012 款")
> str_replace(x, "([a-zA-Z0-9])", " \\1")
# [1] "宝马 X3 2016 款"  "大众速腾 2017 款" "宝马 3 系2012 款"

注:捕获子组采用的是 \\1, \\2, \\3, ....

  • 12
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值