使用r regex

时间:2019-06-15 16:38:23

标签: r regex

如何删除字符串第一个数字之后的所有内容?

x <- c("Hubert 208 apt 1", "Mass Av 300, block 3")

this question之后,我成功删除了第一个数字(包括第一个数字)之前的所有内容:

gsub( "^\\D*\\d+", "", x )
[1] " apt 1"    ", block 3"

但是所需的输出看起来像这样:

[1] "Hubert 208"     "Mass Av 300"
> 

4 个答案:

答案 0 :(得分:4)

在OP的当前代码中,进行较小的更改即可使其工作,即将匹配的模式作为一个组((...))捕获并替换为向后引用(\\1

sub("^(\\D*\\d+).*", "\\1", x)
#[1] "Hubert 208"  "Mass Av 300"

此处,OP中的模式表示("^\\D*\\d+")-从字符串的开头(\\D*)开始的零个或多个不是数字(^)的字符,后跟一个或多个数字(\\d+),并用括号((...))将其捕获为一组。

此外,我们不需要gsub(全局替换),因为我们只需要匹配一个实例(从头开始)

答案 1 :(得分:2)

另一种替代替换的方法是获取表达式并使用匹配项。

通过从字符串^的开头开始匹配,您的模式将一直匹配到第一个数字之后,而不是数字\D* 0+倍,然后是数字\d+的1+倍:< / p>

^\\D*\\d+

Regex demo

如果在perl = TRUE中使用sub,则可以使用\K来忘记匹配的内容。

然后您可以使用:

^\\D*\\d+\\K.*

Regex demo

在替换中,使用一个空字符串。

sub("^\\D*\\d+\\K.*", "", x, perl=TRUE)

答案 2 :(得分:1)

此表达式可能会更安全

^\s*(.+?)([0-9]+)

Demo

答案 3 :(得分:1)

您还可以将当前的正则表达式模式与stringr::str_extract一起使用:

x <- c("Hubert 208 apt 1", "Mass Av 300, block 3")
stringr::str_extract(x, "^\\D*\\d+")

[1] "Hubert 208"  "Mass Av 300"