R 提取以XX.XXXX开头的子字符串

R 提取以XX.XXXX开头的子字符串,r,regex,R,Regex,我有一根绳子 x <- "24.3483 stuff stuff 34.8325 some more stuff" 我已经看过了: >unlist(strsplit(x,”(?您可以使用您的模式,然后匹配非数字\D+,并在末尾断言右侧的字符不是非空白字符(?!\S) \bwordbounary [0-9]{2}\[0-9]{4}匹配2位数字、点和4位数字 *?匹配任何字符0+次非贪婪 (?=\b[0-9]{2}\[0-9]{4}}|$)断言右边的是初始模式或字符串的结尾 | x如果您

我有一根绳子

x <- "24.3483 stuff stuff 34.8325 some more stuff"
我已经看过了:


>unlist(strsplit(x,”(?您可以使用您的模式,然后匹配非数字
\D+
,并在末尾断言右侧的字符不是非空白字符
(?!\S)

  • \b
    wordbounary
  • [0-9]{2}\[0-9]{4}
    匹配2位数字、点和4位数字
  • *?
    匹配任何字符0+次非贪婪
  • (?=\b[0-9]{2}\[0-9]{4}}|$)
    断言右边的是初始模式或字符串的结尾
|


x如果您确定中间文本中没有数字

stringr::str_extract_all(x, "[0-9]{2}\\.[0-9]{4}[^0-9]+")
(这包括一个额外的空间,您可以使用
trimws()

或者,您可以使用
stringr::str\u locate\u all()
查找起始位置。它有点笨重,但

pos <- stringr::str_locate_all(x, "[0-9]{2}\\.[0-9]{4}")[[1]][,"start"]
pos <- c(pos,nchar(x)+1)
Map(substr,pos[-length(pos)],pos[-1]-1,x=x)

pos如果您不介意将数据放入数据帧/tible中,可以使用以下方法:

library(tidyverse)
x <- tibble(data = c("24.3483 stuff stuff 34.8325 some more stuff"))

x %>% mutate(data_split = str_extract_all(data,
                                          pattern = "\\d{2}\\.\\d{4}[^(\\d{2}\\.\\d{4})]+"))
库(tidyverse)
x%变异(数据分割=str提取所有数据,
pattern=“\\d{2}\\.\\d{4}[^(\\d{2}\\.\\d{4})]+”)
您将得到一个列表列,其条目是字符串的拆分部分。

您可以使用

x <- "24.3483 stuff stuff 34.8325 some more stuff"
unlist(strsplit(x, "\\s+(?=[0-9]{2}\\.[0-9]{4})", perl=TRUE))
[1] "24.3483 stuff stuff"     "34.8325 some more stuff"

x不幸的是,有。为了澄清,XX.XXXX模式确实表示每个子字符串的开头。子字符串本身可能有数字,而不是每个子字符串的开头,但是XX.XXXX模式除了在开头之外不会出现在其他地方。当然,您不需要将数据置为into一个数据帧,如Ben的帖子所示。我正准备发布这个(没有
+
,这是一个很好的操作)。我认为这与我的第一个解决方案具有相同的限制…?如果中间文本中有数字会怎样…?@BenBolker我明白了,那么使用非贪婪量词也可以做到。我已更新了答案。这可能有助于添加更难的示例,例如中间文本中有数字的示例
stringr::str_extract_all(x, "[0-9]{2}\\.[0-9]{4}[^0-9]+")
pos <- stringr::str_locate_all(x, "[0-9]{2}\\.[0-9]{4}")[[1]][,"start"]
pos <- c(pos,nchar(x)+1)
Map(substr,pos[-length(pos)],pos[-1]-1,x=x)
library(tidyverse)
x <- tibble(data = c("24.3483 stuff stuff 34.8325 some more stuff"))

x %>% mutate(data_split = str_extract_all(data,
                                          pattern = "\\d{2}\\.\\d{4}[^(\\d{2}\\.\\d{4})]+"))
x <- "24.3483 stuff stuff 34.8325 some more stuff"
unlist(strsplit(x, "\\s+(?=[0-9]{2}\\.[0-9]{4})", perl=TRUE))
[1] "24.3483 stuff stuff"     "34.8325 some more stuff"