r - 从字符串中提取允许单词变化的数字

标签 r regex string text

我已经在以下位置询问过这个版本:

Extracting Numbers Based On the Following Term in a String :

我有一些困惑的数据,我需要从没有真正统一输入的字符串变量中提取句子长度。我需要在 monthsdays 变量中输入一个人被判处“ jail ”或“ jail ”的月数或天数,同时忽略变量中的任何其他数字字符串(例如,社区服务天数)。

如果我有数据

library(data.table)
data<-data.table(text=c("Person 1: $1000 fine, 31 months jail", 
                        "Person 2: $500 fine, 45 days jail",
                        "Person 3: 35 dys jail",
                        "Person 4: 14 mnths prison, 30 days community release"))
data


                                                   text
1:                 Person 1: $1000 fine, 31 months jail
2:                    Person 2: $500 fine, 45 days jail
3:                                Person 3: 35 dys jail
4: Person 4: 14 mnths prison, 30 days community release

我需要推断月份和日期信息以形成:

library(data.table)
data<-data.table(text=c("Person 1: $1000 fine, 31 months jail", 
                        "Person 2: $500 fine, 45 days jail",
                        "Person 3: 35 dys jail",
                        "Person 4: 14 mnths prison, 30 days community release"), 
                 months=c("31","","","14"), 
                 days=c("","45","35",""))
data

                                                   text months days
1:                 Person 1: $1000 fine, 31 months jail     31     
2:                    Person 2: $500 fine, 45 days jail          45
3:                                Person 3: 35 dys jail          35
4: Person 4: 14 mnths prison, 30 days community release     14   

我一直在尝试使用 library(qdap) 来解决这个问题,并根据我之前的问题调整以下代码:

library(dplyr)
data <- dplyr::mutate(data,
                      months = stringr::str_extract(text, "\\d+(?=\\s*months*)"),
                      days = stringr::str_extract(text, "\\d+(?=\\s*days*)"))

但是,我什么也没做。不可否认,文本分析是一个弱点,我很快就学会了用 str_extract(text, "\\d+(?=\\s*days|dys*jail|prison)") 不执行任何操作。

如果您能提供任何帮助,我们将不胜感激。试图找出一种编码方法,这样我就不必手动编码数千个观察结果。

最佳答案

我们可以使用 tidyr::extract 来匹配一个数字,后跟一个以 "m""d" 开头的单词然后是 jail 或 jail 。

tidyr::extract(data, text, into = c("months", "days"), 
   regex = ".*?(\\d+)\\sm.*\\s(?=jail|prison)|.*?(\\d+)\\sd.*\\s(?=jail|prison)", 
   remove = FALSE, convert = TRUE)

#                                                   text months days
#1:                 Person 1: $1000 fine, 31 months jail     31   NA
#2:                    Person 2: $500 fine, 45 days jail     NA   45
#3:                                Person 3: 35 dys jail     NA   35
#4: Person 4: 14 mnths prison, 30 days community release     14   NA

我们还可以将模式组合在一起并使其更短,但由于我们需要两个不同的列,其中包含 "month""days" 信息,我重复了该模式“|”

<小时/>

@thelatemail 建议使用 strcapture 的基本 R 版本

strcapture(".*?(\\d+)\\sm.*\\s(?=jail|prison)|.*?(\\d+)\\sd.*\\s(?=jail|prison)", 
            data$text, proto=list(months=1L,days=1L), perl=TRUE)

关于r - 从字符串中提取允许单词变化的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59365490/

相关文章:

mysql - SQL语句中字符串的正则表达式

php - 如何用星号替换字符串的一部分?

c# - 为什么我不能在公共(public)静态字符串上使用串联

C# 字符串约定解析

r - 在 R 中使用西里尔字母

r - 在 R 中以 XML 格式编译 API 输出

r - 如何解决R中的重要性

r - 将 R 中的列转换为日期时间类型 : as. POSIXct 返回 NA

javascript - 符号作为正则表达式中的可选字符

vb.net - 将字符串转换为十进制,然后再转换回十进制