我試圖用空格替換由非空白空格限定的逗號,同時保持其他逗號不變(在R中)。以逗號分隔的非逗號空格的逗號之間的正則表達式匹配
可以想象我有:
j<-"Abc,Abc, and c"
,我想:
"Abc Abc, and c"
這幾乎工程:
gsub("[^ ],[^ ]"," " ,j)
但它刪除字符的逗號的兩側給:
"Ab bc, and c"
我試圖用空格替換由非空白空格限定的逗號,同時保持其他逗號不變(在R中)。以逗號分隔的非逗號空格的逗號之間的正則表達式匹配
可以想象我有:
j<-"Abc,Abc, and c"
,我想:
"Abc Abc, and c"
這幾乎工程:
gsub("[^ ],[^ ]"," " ,j)
但它刪除字符的逗號的兩側給:
"Ab bc, and c"
你可以使用一個PCRE正則表達式爲負回顧後與前瞻:
j <- "Abc,Abc, and c"
gsub("(?<!\\s),(?!\\s)", " ", j, perl = TRUE)
## => [1] "Abc Abc, and c"
詳細:
(?<!\\s)
- 不能有一個,
,
前一空白右 - 字面,
(?!\\s)
- 一個,
另一種解決方案是後不能有一個空白右側以匹配,
那附有字邊界:
j <- "Abc,Abc, and c"
gsub("\\b,\\b", " ", j)
## => [1] "Abc Abc, and c"
請參閱another R demo。
您可以使用反向引用這樣的:
gsub("([^ ]),([^ ])","\\1 \\2" ,j)
[1] "Abc Abc, and c"
在正則表達式的()
捕捉毗鄰逗號的字符。 \\1
和\\2
以捕獲的順序返回這些捕獲的值。
我們可以嘗試
gsub(",(?=[^ ])", " ", j, perl = TRUE)
#[1] "Abc Abc, and c"
也許這也可以工作:
library("stringr")
j<-"Abc,Abc, and c"
str_replace(j,"(\\w+),([\\w]+)","\\1 \\2")
這是功能等效的:「 」(= \\ S')(<= \\ S')「'? – nrussell
不,負向變換不等於正向變換,因爲正向變換需要模式的存在。通常,在字符串位置的開始/結束處可以看到差異。 '(?<= \ S)'在下一個子模式之前需要一個非空白字符,因此在字符串的開始處不會有匹配。 '(?<!\ s)'表示之前不能有空格,但字符串的開頭可以在那裏。 –
哇,感謝您的快速回復和完美的答案! – tsutsume