2013-11-26 71 views
1

整個字符串考慮以下字符串:匹配R中

string = "I have #1 file and #11 folders" 

我想用這個詞one更換模式#1,但我不希望修改日#11。結果應該是:

string = "I have one file and #11 folders" 

我曾嘗試:

string = gsub("#1", "one, string, fixed = TRUE) 

但是這取代了#1和#11。我也嘗試過:

string = gsub("^#1$", "one, string, fixed = TRUE) 

但是這不能代替任何東西,因爲模式是包含空格的字符串的一部分。

請注意,如果初始字符串看起來像:

string = "I have #1 file blah blah blah and #11 folders" 

我希望得到的結果是:

string = "I have 1 file blah blah blah and #11 folders" 

換句話說,我真的只是想改變精確模式#1而不觸及琴絃的其餘部分。那可能嗎?

回答

3

諸如gsub之類的工具,那麼將使用perl正則表達式引擎,其中有一些選項可以提供幫助。

圖案「#1 \\ B」將匹配#1後跟一個字邊界,所以它會匹配#1,但不#11(由於在2 1的之間無邊界)。也有積極和消極的樣子工具未來這認準的事以下的模式(譬如Word文件),但不包括他們在部分更換。

+0

這聽起來像在'pattern'參數中使用'[:alpha:]'類,沒有'perl = TRUE',是的? – TheComeOnMan

+0

@Codoremifa,'\ w'類似於'[:alpha:]',但我的意思是(現在已經修復)是'\ b'(都需要一個額外的'\'來轉義另一個) 「字」字和「非字」字之間沒有任何內容,在這種情況下,「1」和「」之間沒有任何內容匹配,但不包含「1」和「1」之間的內容。 –

1

使用#1後面的空格,你的優勢:

gsub("#1 ", "one ", string, fixed = TRUE) 

[1] "I have one file and #11 folders" 
+0

這將失敗的那句「我有1號文件和#1文件夾」。 – Justin

+0

我應該在我的帖子中指出這是一個非常簡單的例子。實際上,我在一個文件中匹配模式,我不知道模式之前或之後有多少空格。因此,這個解決方案對我來說並不真正。 – Mayou

+0

賈斯汀不會不會...? @Mariam - 這個解決方案適用於你所有的例子。 – eddi

4

我不知道如果我的理解沒錯,但是這是否幫助 - 如果使用perl=TRUE參數

a <- "I have #1 file and #11 folders" 
b <- "I have #1file and #11 folders" 
c <- "I have #1,file and #11 folders" 

> gsub(x = a, pattern = "#1.*file", replacement = "one file") 
[1] "I have one file and #11 folders" 
> gsub(x = b, pattern = "#1.*file", replacement = "one file") 
[1] "I have one file and #11 folders" 
> gsub(x = c, pattern = "#1.*file", replacement = "one file") 
[1] "I have one file and #11 folders" 
+0

你能解釋一下。*的作用嗎?謝謝 – Mayou

+0

'。*'表示查找「#1」和「file」之間的任意數量的字符。這grep會改變字符串,「我有#1等等等等等等等文件」,也「我有一個文件」。 – TheComeOnMan

+0

哦,我現在明白了。那麼,如果我不知道'#1'後面的單詞是什麼(即我不知道這個單詞是否是'file'或其他)?有沒有一種推廣這種方式?另外,如果字符串是「我有#1等等等等文件」,我想保持等等等等 – Mayou