Data <- c("My name is Ernst.","I love chicken","Hello, my name is Stan!","Who?","I Love you!","Winner")
函數應該添加一個「。」如果在句子結尾處沒有任何這些符號[。?!]來結束句子。如何添加「。」在R條件下的字符串之後
我想在正則表達式的幫助下在R中建立一個函數,但我有一些問題只看字符串的結尾。
Data <- c("My name is Ernst.","I love chicken","Hello, my name is Stan!","Who?","I Love you!","Winner")
函數應該添加一個「。」如果在句子結尾處沒有任何這些符號[。?!]來結束句子。如何添加「。」在R條件下的字符串之後
我想在正則表達式的幫助下在R中建立一個函數,但我有一些問題只看字符串的結尾。
以下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."
使用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."
下面是一些可能的方案:
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(".", "!", "?"), "", "."))
這是另一種解決方案。
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."