当前位置:

R语言正则表达式基础

访客 2024-04-25 905 0

一、背景

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

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

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

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

二、基本语法

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("宝马X32016款","大众速腾2017款","宝马3系2012款")>str_replace(x,"([a-zA-Z0-9])","\\1")#[1]"宝马X32016款""大众速腾2017款""宝马3系2012款"

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

发表评论

  • 评论列表
还没有人评论,快来抢沙发吧~