[英]R regex to remove all except letters, apostrophes and specified multi-character strings
是否有一個R正則表達式刪除除字母,撇號和指定的多字符串之外的所有字符串? “指定的多字符串”是任意的並且具有任意長度。 比方說, "~~"
和&&
在這種情況下,(所以~
& &
應該被刪除,但不是~~
& &&
)
我在這里:
gsub("[^ a-zA-Z']", "", "I like~~cake~too&&much&now.")
這使:
## [1] "I like~~cake~toomuchnow"
和...
gsub("[^ a-zA-Z'~&]", "", "I like~~cake~too&&much&now.")
給...
## "I like~~cake~too&&much&now"
如何編寫R正則表達式給出:
"I like~~caketoo&&muchnow"
來自Casimir和BrodieG的EDIT角落案例......
我期待這種行為:
x <- c("I like~~cake~too&&much&now.", "a~~~b", "a~~~~b", "a~~~~~b", "a~&a")
## [1] "I like~~caketoo&&muchnow." "a~~b"
## [3] "a~~~~b" "a~~~~b"
## [5] "aa"
目前的方法都沒有給出這一點。
一種方法是匹配/捕獲“指定的多字符串”,同時替換其他字符串。
gsub("(~~|&&)|[^a-zA-Z' ]", "\\1", x)
# [1] "I like~~caketoo&&muchnow" "a~~b"
# [3] "a~~~~b" "a~~~~b"
# [5] "aa"
您可以使用此模式:
gsub("[A-Za-z ']*(?:(?:~~|&&)[A-Za-z ']*)*\\K(?:[^A-Za-z ']|\\z)", "", x, perl=TRUE)
這個想法是建立一個永遠真實的模式,即這句話的翻譯:
我想要保留的子字符串后面跟着我想刪除的字符或字符串的結尾
因此,您需要做的就是描述要保留的子字符串:
[A-Za-z ']*(?:(?:~~|&&)[A-Za-z ']*)*
請注意,由於此子模式是可選的(它與空字符串匹配)並且貪婪,因此整個模式將永遠不會失敗,無論字符串上的位置如何,因此所有匹配都是連續的(無需添加\\G
錨點)從開始到結束。
出於同樣的原因,不需要添加占有量詞或使用原子組來防止災難性的回溯,因為(?:[^A-Za-z ']|\\\\z)
不能失敗。
此模式允許在幾個步驟中替換字符串,但您可以更多地改進它:
(*COMMIT)
避免最后一場比賽(因為它只匹配你想要保留的字符或結束前的空字符串,這是無用的 (*COMMIT)
。 它會強制正則表達式引擎在達到字符串結尾后停止搜索:
[A-Za-z ']*(?:(?:~~|&&)[A-Za-z ']*)*\\K(?:[^A-Za-z ']|\\z(*COMMIT).)
(除非他們是~
或&
)
[A-Za-z ']*(?:(?:~~|&&)[A-Za-z ']*)*\\K(?:[^A-Za-z '][^A-Za-z '~&]*|\\z(*COMMIT).)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.