在R中定义字符串

xfb7svmp  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(116)

我有这个挑战:
我希望能够以以下方式提取字符串的一部分:
1.字符串可能有点,也可能没有点,或者可能有很多点
1.我想提取第一个点之前的字符串部分,如果没有点,那么我想要整个字符串
1.我想用正则表达式来实现这一点

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或小写字母开头,并且所有其他字符串都在其后,这就是为什么.+
[.\B]?=一个点或一个世界边界,可能是也可能不是,这就是为什么?

这不是给我想要的我错在哪里

aiazj4mn

aiazj4mn1#

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

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

字符串
替换在这里工作得很好,因为它对任何没有任何点的输入都没有操作,在这种情况下返回原始字符串。

83qze16e

83qze16e2#

我的正则表达式是“匹配任何东西,要么是一个点,要么是行尾”。

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

字符串
测试结果:

[1] "This_This-This" "This_This-This" "This_This-This" "this" "this"

gwo2fgha

gwo2fgha3#

一个简单的提取是使用str_extract和一个负字符类匹配除.之外的任何字符:

libraryr(stringr)
str_extract(test, "[^.]+")
[1] "This_This-This" "This_This-This" "This_This-This" "this"           "this"

字符串
数据类型:

test <- c("This_This-This.Not This",
          "This_This-This.not_.this",
          "This_This-This",
          "this",
          "this.Not This")

相关问题