【问题标题】:Extract All Strings between a sequence of numbers提取数字序列之间的所有字符串
【发布时间】:2018-04-11 13:08:34
【问题描述】:

我正在处理一个正则表达式,其中我有一个字符串,该字符串有一系列数字,四个数字然后名称重复多个。

文本模式是一系列 4 个数字,然后是一个字符串。我想在四个数字之后提取字符串。这四个数字必须出现在字符串之前。在下面的示例中,我不想提取“不是这个”,而是想要四个数字后面的字符串。

string_to_inspect <-"Not This One 4586 This one 8888 Another one 8955 PS109  8566 Last One"

我的理想提取是一个看起来像这样的字符向量:

"This one" "Another one" "PS109" "Last One"

我试过了

str_extract_all(pattern = "[0-9]{4}(.*?)", string = string_to_inspect) 

它返回一个包含所有数字的字符串

"4586 This one 8888 Another one 8955 PS109  8566 Last One"

我尝试了各种组合,但我知道我一定遗漏了一些关键的东西。

【问题讨论】:

  • 您的代码返回[1] "4586" "8888" "8955" "8566"。这里有什么要求?
  • strsplit(string_to_inspect, " \\d{4} "),也许吧?
  • @WiktorStribiżew "This one" "Another one" "PS109" "Last One" 字符向量
  • 这是预期的结果。对图案有什么要求?它应该匹配什么以及为什么?
  • 您可以使用trimws(str_extract_all(string_to_inspect, "(?&lt;=\\b[0-9]{4}\\s{1,100}).*?(?=\\b[0-9]{4}|$)")[[1]])。或trimws(str_match_all(string_to_inspect, "\\b[0-9]{4}\\s+(.*?)(?=\\b[0-9]{4}|$)")[[1]][,2]).

标签: r regex stringr


【解决方案1】:

我们可以将字符串分成四位数,去掉第一个,然后修剪空格。

library(stringr)

str_trim(str_split(string_to_inspect, pattern = "\\s[0-9]{4}\\s")[[1]][-1])
# [1] "This one"    "Another one" "PS109"       "Last One"

【讨论】:

  • 完美!谢谢!
  • 当心需要提取的值包含 4 位数字的情况(例如,如果您使用的是 PS1099 而不是 PS109)。
  • @WiktorStribiżew 请查看我的更新。如果我在四位数模式前后添加空格怎么办?这会有帮助吗?
  • @www 由于对 4 位上下文没有具体要求,并且给出了示例输入,是的,这很有帮助。
【解决方案2】:
strsplit(string_to_inspect, " [0-9]+ ")

【讨论】:

    【解决方案3】:

    如果您不希望字符串与数字混合出现问题:

    string_to_inspect <-"Not This One 4586 This one 8888 Another one 8955 PS109  8566 Last One"
    str2insp <- strsplit(string_to_inspect, ' ')[[1]]
    str2insp[!gsub('[[:digit:]]', '', str2insp) == '']
    

    输出:

    #[1] "Not" "This" "One" "This" "one" "Another" "one" "PS109" "Last" "One"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      • 1970-01-01
      • 2015-05-05
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多