如何添加“。”在R中的条件下的字符串之后

时间:2014-08-30 11:01:46

标签: regex r nlp conditional-statements

Data <- c("My name is Ernst.","I love chicken","Hello, my name is Stan!","Who?","I Love    you!","Winner")

函数应添加&#34;。&#34;如果在句子结尾处没有任何迹象[。?!]来结束判决。

我试图在Regex的帮助下在R中构建一个函数,但我只有一些问题只能查看字符串的结尾。

4 个答案:

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