Data <- c("My name is Ernst.","I love chicken","Hello, my name is Stan!","Who?","I Love you!","Winner")
函数应添加&#34;。&#34;如果在句子结尾处没有任何迹象[。?!]来结束判决。
我试图在Regex的帮助下在R中构建一个函数,但我只有一些问题只能查看字符串的结尾。
答案 0 :(得分:3)
只有当句子未以gsub
或.
或?
符号结束时,以下!
函数才会在句子末尾添加一个点。 / p>
> Data <- c("My name is Ernst.","I love chicken","Hello, my name is Stan!","Who?","I Love you!","Winner")
> gsub("^(?!.*[.?!]$)(.*)$", "\\1.", Data, perl=TRUE)
[1] "My name is Ernst." "I love chicken."
[3] "Hello, my name is Stan!" "Who?"
[5] "I Love you!" "Winner."
在正则表达式中,前瞻用于条件检查。否定预测(?!.*[.?!]$)
会检查行尾的.
或?
或!
是否存在。如果它在最后出现,那么它会跳过句子并且替换将永远不会发生在相应的行上。只有在最后没有.
或?
或!
符号时才会进行替换。
或强>
通过消极的观察和积极的前瞻,
> Data <- c("My name is Ernst.","I love chicken","Hello, my name is Stan!","Who?","I Love you!","Winner")
> sub("(?<![!?.])(?=$)", ".", Data, perl=TRUE)
[1] "My name is Ernst." "I love chicken."
[3] "Hello, my name is Stan!" "Who?"
[5] "I Love you!" "Winner."
答案 1 :(得分:2)
使用stringi
library(stringi)
stri_replace_all_regex(Data, "(?<![^!?.])\\b$", ".")
#[1] "My name is Ernst." "I love chicken."
#[3] "Hello, my name is Stan!" "Who?"
#[5] "I Love you!" "Winner."
答案 2 :(得分:2)
以下是一些可能的方法:
1)如果最后一个字符不是点,?要么 !然后将其替换为该字符后跟dot:
sub("([^.!?])$", "\\1.", Data)
对于我们得到的问题中的数据:
[1] "My name is Ernst." "I love chicken."
[3] "Hello, my name is Stan!" "Who?"
[5] "I Love you!" "Winner."
2) gsubfn解决方案更简单。如果最后一个字符不是点,它用空格替换空()!要么 ?
library(gsubfn)
gsubfn("[^.!?]()$", ".", Data)
3)这个使用grepl
。如果点,!要么 ?是最后一个字符然后追加空字符串,否则追加点。
paste0(Data, ifelse(grepl("[.!?]$", Data), "", "."))
4)这个根本不使用正则表达式。它会选择最后一个角色,如果它是一个点,!要么 ?它附加空字符串,否则附加点:
paste0(Data, ifelse(substring(Data, nchar(Data)) %in% c(".", "!", "?"), "", "."))
答案 3 :(得分:2)
这是另一种解决方案。
x <- c('My name is Ernst.', 'I love chicken',
'Hello, my name is Stan!', 'Who?', 'I Love you!', 'Winner')
r <- sub('[^?!.]\\K$', '.', x, perl=T)
## [1] "My name is Ernst." "I love chicken."
## [3] "Hello, my name is Stan!" "Who?"
## [5] "I Love you!" "Winner."