我在这里有这样的字符串:
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)
你是否建议使用更优雅的单行程序来提取我想要的所有结局?
答案 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"
模式详情:
\\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)
可以被视为稍微更优雅。