如何使用正则表达式在R中删除具有特定开头和结尾的字符串段?

12

我有一个字符串。

str = c("F14 : M114L","W15 : M116L, W15 : M118L","W15 : D111L, F14 : E112L, F14 : M116L")

目标是删除冒号和L之间的所有内容(包括紧挨着冒号前面的空格),以便最终只剩下

"F14", "W15, W15", "W15, F14, F14"
我在考虑使用。
gsub(" : [[:alnum:]]L", "", str)

很明显它不起作用。不知道是否有类似通配符的东西,可以代表在“:”和“L”之间的任意数量的数字和字符。


2
我认为加上一个 + 就可以了:gsub(" : [[:alnum:]]+L","",str) - Frank
它可以工作。有一段时间没有使用正则表达式了。我忘记了 [[:alnum:]] 只能匹配一个字母或数字。 - wen
3个回答

7
这将解决问题:
gsub(" : .*?L", "", str)
#[1] "F14"           "W15, W15"      "W15, F14, F14"

? 这个符号是告诉 .* 在遇到 L 时停止匹配,使其变成非贪婪模式吗?我之前只见过 ? 作为量词。 - Frank
1
@Frank 正确,量词后面的 ? 会使其变成非贪婪模式。它就成为了“懒惰”的量词。 - Jota

7
你可以轻松使用我维护的qdapRegex包来实现这一点:
str = c("F14 : M114L","W15 : M116L, W15 : M118L","W15 : D111L, F14 : E112L, F14 : M116L")

library(qdapRegex)
rm_between(str, "\\s:", "L")
## [1] "F14"           "W15, W15"      "W15, F14, F14"

qdapRegex旨在既能教授又能实用。如果您对所使用的正则表达式感兴趣...

S("@rm_between", "\\s:", "L")
## [1] "(\\s:)(.*?)(L)"

gsub(S("@rm_between", "\\s:", "L") , "", str)

6

有几种方法。

如果始终是三个字母,请取前几个字母:

substr(str,1,3)

我个人也喜欢stringr。它使提取过程变得非常简单。只匹配你想要的,而不是不想要的。

library(stringr)
str_extract(str,"[A-Z][0-9]*")

我已经为向量简化了这些内容,但如果您有子元素,您需要像这样的东西:

splits <- strsplit(str,", ")
result <- lapply(splits, substr, start = 1, stop = 3 )

或者
result <- lapply(splits, str_extract, pattern = "[A-Z][0-9]*")

啊,是的,关于substr解决方案。很好的发现。 - Brandon Bertelsen

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