在R中使用正则表达式检索第二个句点('.')之前的字符串

4
什么正则表达式可以检索(例如使用sup())第二个句点之前的字符。给定一个类似的字符向量:
v <- c("m_s.E1.m_x.R1PE1", "m_xs.P1.m_s.R2E12")

我想把这个返回:
[1] "m_s.E1" "m_xs.P1"
2个回答

4
> sub( "(^[^.]+[.][^.]+)(.+$)", "\\1", v)
[1] "m_s.E1"  "m_xs.P1"

现在让我解释一下:第一个和第三个成对的"[ ]"中的符号匹配除了句点之外的任何字符("字符类"),后面跟随的加号表示这些字符可以重复任意多次。因此,[.]仅匹配第一个句点,第二个句点会终止匹配。括号允许你指定匹配字符的部分区域,并且有两个部分。第二部分是任意字符(句点符号)重复任意次直到字符串的结尾$"\\1"只指定返回值为第一个部分匹配。

运算符^在方括号内外有不同的含义。在方括号外面,它表示字符串的长度为零的开头。在方括号内部,在字符类规范的开始处,它表示否定操作。

这是“字符类”的一个很好的使用案例,可以在输入以下内容查找帮助页面以了解更多信息:

?regex

你只需要一个捕获组,不需要第二个。 - Avinash Raj
不错,BondedDust。你能解释一下吗?我不太懂正则表达式。谢谢! - user3375672
同意第二组括号是多余的。 - IRTFM
已经掌握了第一部分!但是为什么需要 (.+$) 部分呢? - user3375672
它只能是.+$,但如果不在括号外面,整个字符串都会被返回。 - IRTFM

3

不是使用正则表达式,而是利用 qdap 包中的 beg2char 函数来处理:

library(qdap)
beg2char(v, ".", 2)

## [1] "m_s.E1"  "m_xs.P1"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接