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

wen*_*wen 12 regex replace r wildcard

我有一个字符串.

str = c("F14 : M114L","W15 : M116L, W15 : M118L","W15 : D111L, F14 : E112L, F14 : M116L")
Run Code Online (Sandbox Code Playgroud)

目标是删除:和L之间的任何东西(也包括:)前面的空白区域,这样我最终会拥有

"F14", "W15, W15", "W15, F14, F14"
Run Code Online (Sandbox Code Playgroud)

我正在考虑使用

gsub(" : [[:alnum:]]L", "", str)
Run Code Online (Sandbox Code Playgroud)

但显然它不起作用.不知道是否有类似通配符的东西可以代表任意数量的数字和字符:和L.

Jot*_*ota 7

这样做:

gsub(" : .*?L", "", str)
#[1] "F14"           "W15, W15"      "W15, F14, F14"
Run Code Online (Sandbox Code Playgroud)

  • 我看到了双倍. (7认同)

Tyl*_*ker 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"
Run Code Online (Sandbox Code Playgroud)

qdapRegex的目的是在它教导时有用.如果您对使用的正则表达式感兴趣...

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

gsub(S("@rm_between", "\\s:", "L") , "", str)
Run Code Online (Sandbox Code Playgroud)


Bra*_*sen 6

几种方法.

如果它总是三个,请取前几个字母:

substr(str,1,3)
Run Code Online (Sandbox Code Playgroud)

我个人也喜欢stringr.它使提取非常简单.模式你想要的,而不是你不想要的.

library(stringr)
str_extract(str,"[A-Z][0-9]*")
Run Code Online (Sandbox Code Playgroud)

我已经为矢量简化了这些,但你有子元素,你需要这样的东西:

splits <- strsplit(str,", ")
result <- lapply(splits, substr, start = 1, stop = 3 )
Run Code Online (Sandbox Code Playgroud)

要么

result <- lapply(splits, str_extract, pattern = "[A-Z][0-9]*")
Run Code Online (Sandbox Code Playgroud)