【发布时间】:2019-04-30 08:03:43
【问题描述】:
我想使用stringr::str_match 和rebus::capture 捕获字符串的某些部分,但我无法找出正确的模式。
文本可能包含一些特殊字符。类似的东西:
数据:
df <- structure(list(ID = c(1, 1, 1, 2, 2), TEXT = c("VERIFIED DATE/TIME: 24/11/2018 16:23, VERIFIED PERSON IN CHARGE: JOHN",
"HISTORY aaaAAA# 111 FINDINGS Bb123 CONCLUSION 987CCC ccc654",
"DIAGNOSIS abc def hij", "VERIFIED DATE/TIME: 25/10/2018 16:23, VERIFIED PERSON IN CHARGE: Mary",
"HISTORY eeeEEE@ 111 FINDINGS Bb321 CONCLUSION 987FFF ggg654"
)), .Names = c("ID", "TEXT"), row.names = c(NA, 5L), class = "data.frame")
# ID TEXT
# 1 1 VERIFIED DATE/TIME: 24/11/2018 16:23, VERIFIED PERSON IN CHARGE: JOHN
# 2 1 HISTORY aaaAAA# 111 FINDINGS Bb123 CONCLUSION 987CCC ccc654
# 3 1 DIAGNOSIS abc def hij
# 4 2 VERIFIED DATE/TIME: 25/10/2018 16:23, VERIFIED PERSON IN CHARGE: Mary
# 5 2 HISTORY eeeEEE@ 111 FINDINGS Bb321 CONCLUSION 987FFF ggg654
所需的输出: 我想将文本分成不同的列:
- 验证日期/时间
- 经过验证的负责人
- 历史
- 发现
- 结论
- 诊断
df_out <- structure(list(ID = c(1, 2), `VERIFIED DATE/TIME` = c("24/11/2018 16:23,", "25/10/2018 16:23,"), `VERIFIED PERSON IN CHARGE` = c("JOHN", "Mary"), HISTORY = c("aaaAAA# 111", "eeeEEE@ 111"), FINDINGS = c("Bb123", "Bb321"), CONCLUSION = c("987CCC ccc654", "987FFF ggg654"), DIAGNOSIS = c("abc def hij", NA)), .Names = c("ID", "VERIFIED DATE/TIME", "VERIFIED PERSON IN CHARGE", "HISTORY", "FINDINGS", "CONCLUSION", "DIAGNOSIS"), row.names = 1:2, class = "data.frame")
代码:
我尝试了以下代码,但它给了我 NA:
library(stringr)
library(rebus)
str_match(df$TEXT, pattern = "VERIFIED DATE/TIME:" %R%
capture(one_or_more(ANY_CHAR)) %R%
"VERIFIED PERSON IN CHARGE:" %R%
capture(one_or_more(ANY_CHAR)))
【问题讨论】:
-
问题似乎源于生成
<regex> ([.]+)的one_or_more(ANY_CHAR),尽管字符类中的点.(在方括号[]内)是一个小点,而不是不再是“任何字符”的意思。可能是rebus包中的错误?str_match(df$TEXT, "VERIFIED DATE/TIME:(.+)VERIFIED PERSON IN CHARGE:(.+)")应该按预期工作