在句子中选择更改特定部分

时间:2018-01-07 18:57:50

标签: r

我有一个用例,我必须将一个句子分成几部分。 已被切断的部分有一个日期戳(格式为-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"

我的想法是这样做的:

  1. 在句子中查找包含两个数值的图案,一个点和两个数值(13.24)
  2. 然后查找句子中的位置并将其剪掉。
  3. 应用一个简单的strsplit来摆脱PAS599。
  4. 关于这是否是正确的方法的任何反馈?我的假设是有更聪明的方法来削减它......?

5 个答案:

答案 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"