R:从第一个字符到字符串末尾的正则表达式
我这里有这样的字符串:R:从第一个字符到字符串末尾的正则表达式,r,regex,R,Regex,我这里有这样的字符串: a <- "-en eller -et eller (uofficielt) -'en eller (uofficielt) -'et" b <- "-ten, -ter, -terne" 我已经找到了一个解决方案,但感觉不是很令人满意或优雅 a <- unlist(strsplit(a, " |,")) a <- a[grep("-", a)] a <- gsub("-", "", a) b <- unlist(strsplit(
a <- "-en eller -et eller (uofficielt) -'en eller (uofficielt) -'et"
b <- "-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)
你有没有一个更优雅的一行的建议,可以提取我想要的所有结尾?我们可以使用stru-extract
我们可以使用stru提取
我认为您需要匹配一个-它前面没有单词char,也就是说,当它是复合词的一部分时不匹配,并且在连字符后面有一个可选的“字符”,后面跟着1+单词chars。然后,你可以使用
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个或多个字母、数字或_
我认为您需要匹配一个-它前面没有单词char,也就是说,当它是复合词的一部分时不匹配,并且在连字符后面有一个可选的“字符”,后面跟着1+单词chars。然后,你可以使用
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个或多个字母、数字或_
如果你想把它保持在R底,我不认为你会得到比你所拥有的更优雅的东西,你总是可以把它做成一行。grep的value参数可能会对您有所帮助,如下所示 也许吧 或
可以考虑稍微优雅一点。如果你想把它保持在R底,我不认为你会得到比你拥有的更优雅的东西,你总是可以把它做成一行。grep的value参数可能会对您有所帮助,如下所示 也许吧 或
可以认为稍微优雅一些。如果在a-,之前必须有一个空格/字符串开头,那么将\\B替换为?。感谢您的精彩解释。我通常只使用正则表达式进行更简单的操作,因此很高兴了解更复杂的操作是如何工作的。如果在a-,之前必须有一个空格/字符串的开头,那么将\\B替换为?。感谢您的精彩解释。我通常只在简单的操作中使用正则表达式,所以了解更复杂的操作是如何工作的很好。什么是非字符?什么是非字符?
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"
substring(grep("-'?\\w", strsplit(a, " ")[[1]], value = TRUE), 2)
gsub("-", "", grep("-'?\\w", strsplit(a, " ")[[1]], value = TRUE)