簡體   English   中英

R正則表達式刪除除字母,撇號和指定的多字符字符串之外的所有字符串

[英]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"  
(?<![&~])[^ a-zA-Z'](?![&~])

試試這個。看看demo。使用perl=True選項。

https://regex101.com/r/wU7sQ0/25

您可以使用此模式:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM