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

函數應該添加一個「。」如果在句子結尾處沒有任何這些符號[。?!]來結束句子。如何添加「。」在R條件下的字符串之後

我想在正則表達式的幫助下在R中建立一個函數,但我有一些問題只看字符串的結尾。

回答

3

以下gsub功能將在只有一句不與.?!符號結束句末加上一個點。

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

在正則表達式中,lookaheads用於條件檢查目的。負向預測(?!.*[.?!]$)將在行結束處檢查.?!的存在。如果它出現在最後,則它跳過句子,替換將不會發生在相應的行上。只有在最後沒有.?!符號時纔會進行替換。

OR

通過負回顧後,積極向前看,

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

下面是一些可能的方案:

1)如果最後一個字符不是點,?要麼 !然後用字符,然後點替換:

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(".", "!", "?"), "", ".")) 
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." 
相關問題