使用r正则表达式删除第一个数字后的字符串

使用r正则表达式删除第一个数字后的字符串,r,regex,R,Regex,如何删除字符串第一个数字之后包含的所有内容 x <- c("Hubert 208 apt 1", "Mass Av 300, block 3") 但所需的输出如下所示: [1] "Hubert 208" "Mass Av 300" > 在OP的当前代码中,一个微小的更改可以使其工作,即将匹配模式捕获为一个组((…)),并替换为反向引用(\\1) 这里,OP中的模式意味着(“^\\D*\\D+”)-从字符串的开头(^)开始(^)有零个或多个不是数字的字符(\\\D*),然

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

x <- c("Hubert 208 apt 1", "Mass Av 300, block 3")
但所需的输出如下所示:

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

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

这里,OP中的模式意味着(
“^\\D*\\D+”
)-从字符串的开头(
^
)开始(
^
)有零个或多个不是数字的字符(
\\\D*
),然后是一个或多个数字(
\\D+
),并将其作为一个带参数的组(
(…)
)捕获


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

此表达式可能稍微安全一些

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

替换的另一个选项是使用表达式并使用匹配

您的模式将匹配到第一个数字之后,方法是从字符串的开头匹配0+次非数字
\D*
,然后再匹配1+次数字
\D+

^\\D*\\d+

如果将sub与perl=TRUE一起使用,则可以使用
\K
来忘记匹配的内容

然后您可以使用:

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

在替换中,请使用空字符串

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

您还可以将当前的正则表达式模式与
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"

x成功了,谢谢。你能解释一下这些符号的含义吗?@NBK我补充了一些描述。希望能有帮助
sub("^\\D*\\d+\\K.*", "", x, perl=TRUE)
x <- c("Hubert 208 apt 1", "Mass Av 300, block 3")
stringr::str_extract(x, "^\\D*\\d+")

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