R语言正则表达式与零宽断言

本文介绍了R语言中正则表达式的使用,特别是零宽断言的概念和应用。通过实例展示了如何利用零宽断言从复杂字符串中精确提取所需信息,例如从文件名中抽取特定部分。总结了正则表达式的关键元素,如(?<=\_)和(?=\_[^\_]*$),并提醒读者注意.与[^\_]的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

R语言的正则表达式

正则表达式(Regular Expression),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本,又称规则表达式,是根据字符串规律按照一定法则,简介表达一组字符串的表达式。几乎所有高级的编程语言都支持正则表达式,正则表达式也广泛运用于文本挖掘、数据预处理等方面。其深刻含义为以简驭繁,通常是从貌似无规律的字符串中发现规律,进而概括性地表达它们所共有的规律和模式。它包括了自能匹配自身的普通字符(如英文字母、数字、标点等)和被转义了的特殊字符(即元字符)。

零宽断言

用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。

实战

需要对一些字符串进行截取,因此去学习了一下正则表达式。下面直接上例子:

> library(tidyverse)
> ann <- read.csv("anno.csv",sep = ",",header = T)
> x <- ann[,1]
> head(x)
[1] "20211104_31020935640_RN21R2311APZA_04.RCC" "20211104_31020935640_RN21R2703APZA_03.RCC"
[3] "20211104_31020935640_RN21R2740APZA_08.RCC" "20211104_31020935640_RN21R5041APZA_07.RCC"
[5] "20211104_31020935640_RN21R5202APZA_09.RCC" "20211104_31020935640_RN21R5834APZA_01.RCC"

我只需要最后RN开头ZA结尾这一段的样本名,通过零宽断言可以很好的实现我的要求:

> str_extract(x,"(?<=\\_)[^\\_]+?(?=\\_[^\\_]*$)")
[1] "RN21R2311APZA" "RN21R2703APZA" "RN21R2740APZA" "RN21R5041APZA" "RN21R5202APZA" "RN21R5834APZA" "RN21R7310APZA"
[8] "RN21R8765APZA" "RN21R9886APZA"

我们为了挑选_ _之间的字符串,利用 (?<= ) 来规定左边的标志,但是不把它匹配进去,利用 (?=) 来规定有右边的标志,同样不将他匹配进去。同时 “\\” 用于转移," [^\\_] “是匹配除了 _ 之外的字符。而$代表是行的结束。
20220826更新,正如这里所说,(?<=) 规定了左边的标志,因此 (?<=\\_) 意味着”_"之前的的字符都不会匹配到(31020935640_RN21R2311APZA_04.RCC)。而 (?=) 规定着右边的标志, “\\_[^\\_]*$” 整个视作右边的标志,
举个例子

> a
[1] "20210326_31020935670_21R4973AZZA_03.RCC"
> str_extract(a,".{12}(?=[^\\_]*$)")#[]意味着会匹配到包括_的任何内容
[1] "21R4973AZZA_"
> str_extract(a,".{12}(?=\\_[^\\_]*$)")#将匹配到的_去掉,右边的标志就好了
[1] "_21R4973AZZA"
> str_extract(a,"(?<=\\_).+(?=\\_[^\\_]*$)")
[1] "31020935670_21R4973AZZA"
> str_extract(a,"(?<=\\_)[^\\_]+(?=\\_[^\\_]*$)")#去掉_之前的字符
[1] "21R4973AZZA"
#大功告成.

当我们用“.”(代表任意元素)去替换掉“[^\\_] ”时,我们发现字符串包括了_之前的数字。也就是说其实左边是匹配到了第一个 _ 。这里应当注意!20220826更新:^代表以某个字符串开头,[^\\_]意味着以_开头的任意字符。所以31020935640会被去掉。

> str_extract(x,"(?<=\\_).+(?=\\_[^\\_]*$)")
[1] "31020935640_RN21R2311APZA" "31020935640_RN21R2703APZA" "31020935640_RN21R2740APZA" "31020935640_RN21R5041APZA"
[5] "31020935640_RN21R5202APZA" "31020935640_RN21R5834APZA" "31020935640_RN21R7310APZA" "31020935640_RN21R8765APZA"
[9] "31020935640_RN21R9886APZA"
> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值