如何在第一次出现模式之前提取所有内容

Ben*_*Ben 14 regex r stringr

我正在尝试使用R中的stringr包从字符串中提取所有内容,直到第一次出现下划线.

我试过的

str_extract("L0_123_abc", ".+?(?<=_)")
> "L0_"
Run Code Online (Sandbox Code Playgroud)

关闭但没有雪茄.我怎么得到这个?另外,理想情况下我想要一些易于扩展的东西,这样我就可以在第一个和第二个下划线之间获取信息,并获得第三个下划线之后的信息.

Wik*_*żew 26

要获得L0,你可以使用

> library(stringr)
> str_extract("L0_123_abc", "[^_]+")
[1] "L0"
Run Code Online (Sandbox Code Playgroud)

[^_]+场比赛1个或更多字符比其他_.

此外,您可以拆分字符串_:

x <- str_split("L0_123_abc", fixed("_"))
> x
[[1]]
[1] "L0"  "123" "abc"
Run Code Online (Sandbox Code Playgroud)

这样,您将拥有所需的所有子字符串.

同样可以实现

> str_extract_all("L0_123_abc", "[^_]+")
[[1]]
[1] "L0"  "123" "abc"
Run Code Online (Sandbox Code Playgroud)


GKi*_*GKi 8

您可以使用subfrom base来使用_.*从 开始的所有内容_

sub("_.*", "", "L0_123_abc")
#[1] "L0"
Run Code Online (Sandbox Code Playgroud)

或者使用[^_]什么都是但不是_

sub("([^_]*).*", "\\1", "L0_123_abc")
#[1] "L0"
Run Code Online (Sandbox Code Playgroud)

substr与 一起使用regexpr

substr("L0_123_abc", 1, regexpr("_", "L0_123_abc")-1)
#substr("L0_123_abc", 1, regexpr("_", "L0_123_abc", fixed=TRUE)-1) #More performant alternative
#[1] "L0"
Run Code Online (Sandbox Code Playgroud)


小智 6

使用 gsub...

gsub("(.+?)(\\_.*)", "\\1", "L0_123_abc")
Run Code Online (Sandbox Code Playgroud)


akr*_*run 5

正则表达式的环顾应该是

str_extract("L0_123_abc", ".+?(?=_)")
#[1] "L0"
Run Code Online (Sandbox Code Playgroud)