一、背景
正则表达式,是根据字符串规律按一定法则,简洁表达一组字符串的表达式。正则表达式通常就是从貌似无规律的字符串中发现规律性,进而概括性地表达它们所共有的规律或模式,以方便地操作处理它们,这是真正的化繁为简,以简御繁的典范。
几乎所有的高级编程语言都支持正则表达式,正则表达式广泛应用于文本挖掘、数据预处理,例如:
- 检查文本中是否含有指定的特征词
- 找出文本中匹配特征词的位置
- 从文本中提取信息
- 修改文本
正则表达式包括:只能匹配自身的普通字符(如英文字母、数字、标点等)和被转义了的特殊字符(称为‘‘元字符’’)。
二、基本语法
2.1常见元字符
2.2特殊字符与反义
示例:
\\S:匹配不包含空白字符的字符串\\d:匹配数字[a-zA-Z0-9]:匹配字母和数字[\u4e00-\u9fa5]:匹配汉字
2.3运算优先级
- 首先,圆括号括起来的表达式最优先
- 其次,表示重复次数的操作(即*{})
- 再次,连接运算(即几个字符放在一起,如abc)
- 最后,或运算(|)
另外,正则表达式还有若干高级用法,常用的有零宽断言
和分组捕获
。
2.4示例
在R语言中,使用正则表达式的方式:library(stringr)
常见的操作是:
- 若仅调试和查看正则表达式的效果,使用:
str_view
和str_view_all()
,将在原字符向量中高亮显示匹配的内容 - 若要提取正则表示式内容,使用
str_extract()
和str_extract_all()
,将提取匹配的第一个或者提取所有的匹配内容。 - 若是替换正则表达式内容,使用
str_replace
和str_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,....
;