我面临这个挑战:
我希望能够通过以下方式提取字符串的一部分:
test<-c("This_This-This.Not This",
"This_This-This.not_.this",
"This_This-This",
"this",
"this.Not This")
由于我需要使用正则表达式,所以我一直在尝试使用这个表达式:
str_match(test,"(^[a-zA-Z].+)[\\.\\b]?")[,2]
但我得到的是:
> str_match(test,"(^[a-zA-Z].+)[\\.\\b]?")[,2]
[1] "This_This-This.Not This" "This_This-This.not_this"
[3] "This_This-This" "this"
[5] "this.Not This"
>
我想要的输出是:
"This_This-This"
"This_This-This"
"This_This-This"
"this"
"this"
这是我的正则表达式背后的思考过程
str_match(test,"(^[a-zA-Z].+)[\\.\\b]?")[,2]
(^[a-zA-Z].+)= 用于捕获点之前的组,因为字符串始终以字母 cpas 或小写字母开头,而其后的所有其他字符串都是 .+
[\. ]?=一个点或一个世界边界,可能是也可能不是,这就是为什么 ?
这不是我想要的。我的错误在哪里?
实际上,正则表达式替换在这里应该可以很好地工作,而不是提取:
test <- c("This_This-This.Not This",
"This_This-This.not_.this",
"This_This-This",
"this",
"this.Not This")
output <- sub("\\..*", "", test)
output
[1] "This_This-This" "This_This-This" "This_This-This" "this"
[5] "this
替换在这里效果很好,因为它对于任何没有点的输入都不起作用,在这种情况下返回原始字符串。
我的正则表达式是“匹配任何到点或行尾的内容”。
library(stringr)
str_match(test, "^(.*?)(\\.|$)")[, 2]
结果:
[1] "This_This-This" "This_This-This" "This_This-This" "this" "this"