R:从第一个字符到字符串结尾的正则表达式

时间:2017-07-12 11:31:03

标签: r regex

我在这里有这样的字符串:

a <- "-en eller -et eller (uofficielt) -'en eller (uofficielt) -'et"
b <- "-ten, -ter, -terne"

我想在R中使用正则表达式将文本从“ - ”提取到第一个非字符,从而得到:

en et 'en 'et
ten ter terne

我找到了一个解决方案,但它感觉不太令人满意或优雅

a <- unlist(strsplit(a, " |,"))
a <- a[grep("-", a)]
a <- gsub("-", "", a)

b <- unlist(strsplit(b, " |,"))
b <- b[grep("-", b)]
b <- gsub("-", "", b)

你是否建议使用更优雅的单行程序来提取我想要的所有结局?

3 个答案:

答案 0 :(得分:2)

我认为你需要匹配一个前面没有单词char的-(也就是说,当它是复合词的一部分时不匹配),之后有一个可选的'连字符,然后是1个字符号。然后,您可以使用

a <- "-en eller -et eller (uofficielt) -'en eller (uofficielt) -'et"
b <- "-ten, -ter, -terne"
pat <- "\\B-\\K'?\\w+"
res_a <- regmatches(a, gregexpr(pat, a, perl=TRUE))
unlist(res_a)
## [1] "en"  "et"  "'en" "'et"
res_b <- regmatches(b, gregexpr(pat, b, perl=TRUE))
unlist(res_b)
## [1] "ten"   "ter"   "terne"

请参阅online R demo

模式详情

  • \\B - 非字边界
  • - - 连字符
  • \\K - 匹配重置运算符
  • '? - 可选的'
  • \\w+ - 一个或多个字母,数字或_

答案 1 :(得分:1)

我们可以使用str_extract

library(stringr)
str_extract_all(a, '(?<=-)[^, ]+')[[1]]
#[1] "en"  "et"  "'en" "'et"


str_extract_all(b, '(?<=-)[^, ]+')[[1]]
#[1] "ten"   "ter"   "terne"

答案 2 :(得分:1)

如果你想把它保存在基础R中,我不认为你会得到更优雅的东西(而且你总能把它变成一个单行)。 grep的value参数可能对您有所帮助,如下所示。

也许

substring(grep("-'?\\w", strsplit(a, " ")[[1]], value = TRUE), 2)

gsub("-", "", grep("-'?\\w", strsplit(a, " ")[[1]], value = TRUE)

可以被视为稍微更优雅。