[英]How can I use gsub to remove specific characters before and after an arbitrary character in string
我正在嘗試使用 gsub 從以下字符串中刪除字符:
string <- "function(data, x = !!rlang::sym(\"Time1\"), y = !!rlang::sym(\"YVAR\")), values = c(\"a\", \"b\"))"
新字符串應返回:
cat(string)
function(data, x = Time1, y = YVAR, values = c("a", "b"))
也就是說,我想刪除::rlang::sym(\"
,保留Time1
,並刪除 Time1 \")
之后的右引號和括號(我也想為YVAR
刪除它)
Time1
和YVAR
(x 和 y 變量名稱)是任意的,可以在結果字符串中命名任何名稱,但是,字符::rlang::sym(\"
以及右引號和括號\")
在需要的任意字符串之后保持不變,不會改變。
我知道我可以簡單地使用
result <- gsub("!!rlang::sym(\"", "", string, fixed = TRUE)
然后
result <- gsub("\")", "", result, fixed = TRUE)
但是,為了獲得其中的一部分,我想找到一個更優雅的正則表達式解決方案,它可以結合這兩個 gsub,當然也不會刪除values = c(\"a\", \"b\"))"
"\")"
values = c(\"a\", \"b\"))"
如果它總是文字::rlang::sym("
,那么這個
cat( gsub('!!rlang::sym\\("(\\S+)"\\)', "\\1", string), "\n" )
# function(data, x = Time1, y = YVAR), values = c("a", "b"))
如果它是一個函數調用/paren/quote,那么它可以概括一下。 我認為你會想要一些特異性,否則你會解析出比你想要的更多的東西。 我假設需要rlang
:
gsub('\\S+rlang\\S+\\("(\\S+)"\\)', "\\1", string)
請注意,您的示例string
::rlang::sym(\"YVAR\"))
中有兩個右括號,它們稍微阻礙了該模式。 如果那是真的,那么......要么用"\\)+
尋找重復,要么......其他東西。
您可以將單個模式與捕獲組一起使用,該組將匹配除"
之外的任何字符,並在替換中使用組 1。
!!rlang::sym\("([^"]+)"\)
string <- "function(data, x = !!rlang::sym(\"Time1\"), y = !!rlang::sym(\"YVAR\")), values = c(\"a\", \"b\"))"
cat(gsub('!!rlang::sym\\("([^"]+)"\\)', "\\1", string))
Output
function(data, x = Time1, y = YVAR), values = c("a", "b"))
利用
result <- gsub("!!rlang::sym\\(\"([\\w\\W]*?)\"\\)", "\\1", string, perl=TRUE)
見證明
擴展
--------------------------------------------------------------------------------
!!rlang::sym '!!rlang::sym'
--------------------------------------------------------------------------------
\( '('
--------------------------------------------------------------------------------
\" '"'
--------------------------------------------------------------------------------
( group and capture to \1:
--------------------------------------------------------------------------------
[\w\W]*? any character of: word characters (a-z,
A-Z, 0-9, _), non-word characters (all
but a-z, A-Z, 0-9, _) (0 or more times
(matching the least amount possible))
--------------------------------------------------------------------------------
) end of \1
--------------------------------------------------------------------------------
" '"'
--------------------------------------------------------------------------------
\) ')'
參見R 證明:
string <- "function(data, x = !!rlang::sym(\"Time1\"), y = !!rlang::sym(\"YVAR\")), values = c(\"a\", \"b\"))"
result <- gsub("!!rlang::sym\\(\"([\\w\\W]*?)\"\\)", "\\1", string, perl=TRUE)
cat(result)
結果: function(data, x = Time1, y = YVAR), values = c("a", "b"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.