获取R中两个符号之间的文本

ryevplcw  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(129)

这可能听起来像一个重复的问题,但我已经花了最后一个小时寻找答案,不能应用其他类似的冠冕堂皇的问题的解决方案,这个问题。
我有一个文本字符串,希望从第二个_和第一个.之间提取文本
我所做的最大工作是从第一个_.之间提取文本,如下所示。

library(stringr)
mytext<-"one_two_three.four"
stringr::str_extract(mytext, "(?<=_)(.+)(?=\\.)")

因此,我想要的答案是three,而不是我的答案给出的two_three
我更喜欢使用str_extract函数,有人可以修改我的尝试以获得所需的答案吗?

6ioyuze2

6ioyuze21#

# Matt L. suggestion
gsub(".*_.*_(.*)\\..*", "\\1", mytext)
[1] "three"

说明:
.*_ =除下划线外的任意数量。
.*_ =除下划线之外的任意数量。
(.*) =任何数量的任何东西,这是一个捕获组。
\\. =句号/句号(".")
.* =任何数量的任何东西
"\\1" =请返回第一个捕获组的内容。

# rawr suggestion
stringr::str_extract(mytext, "(?<=_)([^_]+)(?=\\.)")
[1] "three"

说明:
(?<=_) =正向向后看,即捕获的组前应有下划线
([^_]+) =一个或多个非下划线字符
(?=\\.) =正向前瞻,即在捕获的组之后应该有一个句号/句号
并且从stringr 1.5.0版开始,您可以指定捕获组,因此我的建议是:

# my suggestions:
stringr::str_extract(mytext, "(_.+_)(.+)(\\.)", group = 2)
[1] "three"

说明:
(_.+_) =组1是下划线,然后是除下划线之外的一个或多个任意值。
(.+) =基团2是一个或多个任意值
(\\.) =第3组为句号/句号
group = 2 =请给我第2组

#or 
stringr::str_split_i(mytext, "_|\\.",3)
[1] "three"

说明:
通过删除与"_|\\." =下划线或句号/句点匹配的任何内容将其拆分为块
,3 =给我第三块。

相关问题