R 中的分隔字符串

问题描述 投票:0回答:2

我面临这个挑战:

我希望能够通过以下方式提取字符串的一部分:

  1. 字符串可能有也可能没有点,或者可能有很多点
  2. 我想提取第一个点之前的字符串部分,如果没有点那么我想要整个字符串
  3. 我想使用正则表达式来实现这一点
    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 或小写字母开头,而其后的所有其他字符串都是 .+

[\. ]?=一个点或一个世界边界,可能是也可能不是,这就是为什么 ?

这不是我想要的。我的错误在哪里?

r regex-lookarounds regex-group
2个回答
3
投票

实际上,正则表达式替换在这里应该可以很好地工作,而不是提取:

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

替换在这里效果很好,因为它对于任何没有点的输入都不起作用,在这种情况下返回原始字符串。


1
投票

我的正则表达式是“匹配任何到点或行尾的内容”。

library(stringr)
str_match(test, "^(.*?)(\\.|$)")[, 2]

结果:

[1] "This_This-This" "This_This-This" "This_This-This" "this" "this"          
© www.soinside.com 2019 - 2024. All rights reserved.