我有一个用例,我必须将一个句子分成几部分。 已被切断的部分有一个日期戳(格式为-30.12.17 / 13.24)
文本示例如下所示:
"BEA NR:JH8D78 30.12.17/13.24 ALBERT HEIJN 1311 UTRECH,PAS599"
我想删除的部分是:
"ALBERT HEIJN 1311 UTRECH"
因此"30.12.17/13.24"
之前和之后的部分:",PAS599"
我的想法是这样做的:
(13.24)
关于这是否是正确的方法的任何反馈?我的假设是有更聪明的方法来削减它......?
答案 0 :(得分:0)
我会做两次分裂: 1.-基于斜线" /"拆分,然后是两个字母数字字符,一个点,两个字母数字字符。 2.-然后取第一个分割的第二部分,再用逗号分割。
例如:
t <- "BEA NR:JH8D78 30.12.17/13.24 ALBERT HEIJN 1311 UTRECH,PAS599"
res <- paste(strsplit(t, "/\\d+.\\d+\\s", perl = T)[[1]][1], strsplit(t, ",", perl = T)[[1]][2], sep = ",")
res
[1] "BEA NR:JH8D78 30.12.17,PAS599"
答案 1 :(得分:0)
正则表达式将以一般方式执行
这是一个例子
# install.packages('stringr')
library(stringr)
sample = "BEA NR:JH8D78 30.12.17/13.24 ALBERT HEIJN 1311 UTRECH,PAS599"
pattern = regex(".*\\s\\d+[.]\\d+[.]\\d+/\\d+[.]\\d+\\s*(.*),.*", perl=T)
result = str_match(sample, pattern)
result[2]
在近似英语中,正则表达式正在执行以下操作
查找任何字符,然后查看一些空格,然后是数字模式,后跟一些可选的空格。此时启动一个捕获组并记住任何东西,直到逗号。
str_match
结果的第二个元素是捕获组的内容。
答案 2 :(得分:0)
我建议使用stringr
包来完成你的工作 - 有很多方法可以做正则表达式,但stringr's
语法更简单一些。以下是基于将其变为函数的建议 - 假设您可能有许多结构相同但具有不同数据的情况。
library(stringr)
my_string = 'BEA NR:JH8D78 30.12.17/13.24 ALBERT HEIJN 1311 UTRECH,PAS599'r)
get_middle <- function(my_string){
date <- "(([0-9]{2}[.]){2})[0-9]{2}[/]([0-9]{2}[.])[0-9]{2}[ ]"
after_date <- str_split(my_string, date)[[1]][2] # Remove date and all before
final <- strsplit(after_date, ',')[[1]][1] # Remove comma and all after
return(final)
}
如果你愿意,你可以让它更简洁,但简而言之,这只是创建一个匹配日期的模式:
[0-9]
匹配任意数字的单个数字; {
和}
)表示连续多少次与上一个条目匹配[.]
和[/
]分别匹配句点和斜杠文字然后我分别用逗号分开。
答案 3 :(得分:0)
当收到的文字没有很好的分隔符时,我喜欢regular expressions。但它需要比strsplit()
更多的努力。如果这项任务是你唯一能做到的,那么学习正则表达式可能并不值得。但是一旦你学会了它们,你就会看到很多利用它们的机会。
以下正则表达式模式提取/捕获&#34; 13.24&#34; &#34; ALBERT HEIJN 1311 UTRECH&#34;。它隐藏在模式中,但括号是使一切运转的原因。他们capture要捕获/提取的输入元素。然后gsub()
将整个匹配替换为第一个(&#34; \ 1&#34;)或第二个(&#34; \ 2&#34;)组。
pattern <- "^.+?/(\\d{2}\\.\\d{2}) (.+?),\\w{2,}\\d{3,}$"
ds <- tibble::tibble(
x = c(
"BEA NR:JH8D78 30.12.17/13.24 ALBERT HEIJN 1311 UTRECH,PAS599",
"ABC NR:JH8D78 30.12.17/09.00 Piggly Wiggly 91 Dorestad,PAS601"
)
)
此regex tester解释了上述模式中使用的不同令牌。如果您需要使模式更灵活,它也是一个起点。 (我对您必须从客户端读取的地理空间输入类型做了一些假设。)当您将模式从测试仪移动到R时,请记住逃避反斜杠(这实际上意味着将单个反斜杠转换为双精度)
ds$y1 <- as.numeric(gsub(pattern, "\\1", ds$x))
ds$y2 <- gsub(pattern, "\\2", ds$x)
> ds[, c("y1", "y2")]
# A tibble: 2 x 2
y1 y2
<dbl> <chr>
1 13.24 ALBERT HEIJN 1311 UTRECH
2 9.00 Piggly Wiggly 91 Dorestad
答案 4 :(得分:0)
以最简单的形式假设",PAS"
在结尾处是固定字符。我使用vector
来展示转换多行,其中每一行将成为vector
的元素。
v <- c("BEA NR:JH8D78 30.12.17/13.24 ALBERT HEIJN 1311 UTRECH,PAS599")
lst <- lapply(strsplit(v, "\\/[0-9]+\\.[0-9]+ |,PAS[0-9]+", perl = TRUE), function(x){
x[2]
})
#> lst
#[[1]]
#[1] "ALBERT HEIJN 1311 UTRECH"