2013-11-26 74 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