【问题标题】:extract number only after specific word by skipping other word in between it通过在特定单词之间跳过其他单词,仅在特定单词之后提取数字
【发布时间】:2021-12-31 03:17:17
【问题描述】:

我正在寻找“年”一词之前的两位数和“年”一词之后的七位或八位数字。数据示例如下所示。

data <- "mr john is 45 years old his number is 12345678, mr doe is 57 years 7654321"

data <- as.list(data)

我尝试了这种方法,并且成功地在“年”这个词之前获得了两位数:

stringr::str_extract_all(data,regex(".\\d{2}\\s(?:year)"))

我也尝试过这种方法来获取单词“years”之后的数字:

str_extract_all(data,regex(".\\d{2}\\s(?:year).\\d{7,8}"))

我设法得到了直接出现在单词 years 之后的数字:

" 57 year 7654321"

但是,我没有成功获得“年”字后面的八位数字,其中包括数字和“年”字之间的其他字符。

如何通过跳过其他单词/字符仅在单词“years”之后检索数字?

非常感谢您的帮助

【问题讨论】:

  • 你能确认预期的输出吗?请注意,您的输入没有 57 year 7654321 子字符串
  • 谢谢,预期结果是45 years 12345678, 57 years 7654321
  • 如果您的字符串不能在 year 和 7-8 位数字之间包含另一个数字,Akrun 的解决方案将适用于您。
  • years old his number is 是数字的中间吗?否则数字,不是数字,数字是你的解决方案,没有其他的
  • 如果字符串是“john is 45 his number is 12345678, mr doe 7654321”怎么办? "12345678""7654321" 都在 "years" 之后。我怀疑你只想要前者,但从你如何陈述你的问题中并不清楚。你的问题需要澄清。请记住,提供示例用于说明;它们不能替代对问题的完整和明确的文字陈述。

标签: r regex


【解决方案1】:

我们可以使用str_replace匹配并去除“年”前后的非数字,然后提取包括“年”在内的年前后的数字

library(stringr)
str_extract_all(str_replace_all(data,
     "(?<=years)\\D+|(\\D+)(?=years)", " "), "\\d{2}\\s+years\\s+\\d{7,8}")[[1]]
[1] "45 years 12345678" "57 years 7654321" 

或者另一种选择是捕获数字,以及带有 str_matchpaste 的“年”子字符串一起

library(purrr)
library(dplyr)
str_match_all(data, "(\\d{2})\\D+(years)\\D+(\\d{7,8})")[[1]][,-1] %>% 
     as.data.frame %>% 
     invoke(str_c, sep =" ", .)
[1] "45 years 12345678" "57 years 7654321" 

数据

data <- "mr john is 45 years old his number is 12345678, mr doe is 57 years 7654321"

【讨论】:

  • 谢谢先生,这解决了我的问题
  • 如果字符串是“john is 45 岁 1 his number is 12345678”怎么办?
  • @CarySwoveland 在这种情况下,可能是str_match_all(data, "(\\d{2})\\D+(years).*(\\d{7,8})")[[1]][-1]# [1] "45" "years" "2345678"。你说得对,我是根据中间没有数字的假设来制作模式的
【解决方案2】:

这是一个基本的 R 方法:

  1. 创建一个以strsplit 分隔的列表,以, 分隔
  2. 定义一个函数my_func,它接受一个字符串并在年份之前和之后搜索数字,然后将所有内容粘贴在一起。
  3. 使用lapply 将您的函数应用到列表中。
  4. 使用toString() 获得预期的输出。
my_list <- strsplit(data, ",")

my_func <- function(x){
a <- as.integer(sub(".*?(\\d+)\\s*year.*", "\\1", x))
b <- as.integer(sub(".*?year.*?(\\d+).*", "\\1", x))
paste(a, "year", b)
}

result <- lapply(my_list, my_func)
lapply(result, toString)

输出:

[[1]]
[1] "45 year 12345678, 57 year 7654321"

【讨论】:

    猜你喜欢
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2014-04-01
    • 2019-10-10
    • 1970-01-01
    • 2021-07-04
    • 2015-11-19
    相关资源
    最近更新 更多