【问题标题】:Stringr function or or gsub() to find an x digit string and extract first x digits?Stringr 函数或 gsub() 查找 x 位字符串并提取前 x 位?
【发布时间】:2019-10-23 18:43:12
【问题描述】:

Regex 和 stringr 新手在这里。我有一个数据框,其中有一列我想从中找到 10 位数字并只保留前三位。否则,我只想保留那里的任何东西。

所以为了简单起见,让我们假设它是一个像这样的简单向量:

new<-c("111", "1234567891", "12", "12345")

我想编写代码,该代码将返回一个包含以下元素的向量:111、123、12 和 12345。我还需要编写代码(我假设我会迭代地执行此操作)在其中提取前两位数字一个 5 位数的字符串,如上面的最后一个元素。

我试过了:

gsub("\\d{10}", "", new)

但我不知道我可以为替换参数添加什么来获得我正在寻找的东西。也试过了:

str_replace(new, "\\d{10}", "")

但我还是不知道要为替换参数输入什么来仅获取前 x 位。

编辑:我不同意这是一个重复的问题,因为我不仅想从字符串中提取前 X 位数字,而且还需要使用与模式匹配的特定字符串(例如,10 位数字字符串。 )

【问题讨论】:

  • 试试sub("^(\\d{3})\\d{7}$", "\\1", new),见this demo
  • 请不要使用像new这样的变量名。
  • @NelsonGon,我通常不会,但谢谢!只是为了举例。
  • @WiktorStribiżew,谢谢。您能否将此扩展为下面的答案并解释代码的工作原理?然后我会接受它作为答案。我可以看到它有效,但我想确定我理解如何,特别是因为我可能需要将代码重用于其他目的。
  • @panpsych77 Posted 带有解释和演示。

标签: r regex string stringr


【解决方案1】:

你可以使用:

 as.numeric(substring(my_vec,1,3)) 
#[1] 111 123  12

【讨论】:

    【解决方案2】:

    如果您愿意使用库 stringr,您正在使用的 str_replace 来自该库。只需使用str_extract

    vec <- c(111, 1234567891, 12)
    str_extract(vec, "^\\d{1,3}")
    

    正则表达式^\\d{1,3} 匹配出现在短语开头的至少 1 到最多 3 位数字。 str_extract,顾名思义,提取并返回这些匹配项。

    【讨论】:

    • 谢谢。唯一的问题是有一些字符串我需要做一些不同的事情。也就是说,有些字符串有 5 位数字,我只需要提取前两位。因此,我一直在寻找一种方法来匹配特定模式,然后替换而不是通常从向量中的所有字符串中提取最多 3 个第一个数字。我希望澄清。我编辑了我的问题以反映这一点。
    【解决方案3】:

    你可以使用

    new<-c("111", "1234567891", "12")
    sub("^(\\d{3})\\d{7}$", "\\1", new)
    ## => [1] "111" "123" "12" 
    

    请参阅R online demoregex demo

    Regex graph:

    详情

    • ^ - 字符串锚的开始
    • (\d{3}) - 捕获组 1(在替换模式中使用 \1 访问此值):三位字符
    • \d{7} - 七位字符
    • $ - 字符串锚点结束。

    因此,sub 命令仅匹配仅由 10 位数字组成的字符串,将前三个数字捕获到单独的组中,然后将整个字符串(因为它是整个匹配项)替换为在第 1 组。

    【讨论】:

    • 我想指出,这也解决了我在编辑中提到的问题,即我想迭代地使用代码来挑选其他长度的字符串(例如,4 位数字)并替换为前 2 位数字等,例如将其更改为:sub("^(\\d{2})\\d{2}$", "\\1", new)。感谢您提供非常有用且详细的答案(我没有足够的声誉点来支持它)。
    猜你喜欢
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多