首页 > 解决方案 > R中匹配的&符号系列?

问题描述

我无法解决以下问题。请求所有人在这方面帮助我。

我的数据中有一系列&符号(&),我想用一些值替换一对&符号,但由于某种原因我无法做到。

我的尝试和例子:

string1 <- "This aa should be replaced: but this aaa shouldn't"
string2 <- "This && should be replaced: but this &&& shouldn't"

gsub("aa", "XXX", string1)       #1.
gsub("\\baa\\b", "XXX", string1) #2.

gsub("&&", "XXX", string2)       #3.
gsub("\\b&&\\b", "XXX", string2) #4.

上面,如果我想匹配 string1 中的 'aa',我可以有两种方法,

在方法 1(表示为:#1)中,我可以简单地传递 'aa' 但这也会部分匹配 'aaa',这是我不想要的,我希望我的正则表达式完全匹配成对的 'a',其中我的情况是'aa'。

为了解决这个问题,我使用了正则表达式(#2),在这种情况下它工作正常。

现在,在 string2 中,我期望有类似的行为,而不是匹配一对 'a' 我想匹配一对不匹配的 '&&'。

(#3) 尝试正在工作,但这不是我想要的结果,因为它也部分匹配'&&&',

(#4) 尝试由于某种原因不起作用,并且它没有替换字符串。

我的问题是:

1) Why pair of ampersands are not working with boundary conditions ?

2) What is the way around to solve this problem ?

我真的很难过,因此浪费了我一整天,真的感觉很糟糕,尝试在谷歌上找到解决方案,但尚未成功。

如果有人知道,如果它在那里,请将我重定向到一个帖子。或者如果有人发现它是重复的,请告诉我,我会删除它。

感谢您的帮助和阅读问题。

编辑:我的单词边界现在是空格。

输出

> gsub("aa", "XXX", string1)
[1] "This XXX should be replaced: but this XXXa shouldn't"
> gsub("\\baa\\b", "XXX", string1)
[1] "This XXX should be replaced: but this aaa shouldn't"
> 
> gsub("&&", "XXX", string2)
[1] "This XXX should be replaced: but this XXX& shouldn't"
> gsub("\\b&&\\b", "XXX", string2)
[1] "This && should be replaced: but this &&& shouldn't"
> 

注意:我也检查了 perl=TRUE,但它不起作用。

标签: rregexgsub

解决方案


\b边界一词的意思是:

有资格作为单词边界的三个不同位置:

  • 在字符串的第一个字符之前,如果第一个字符是单词字符。
  • 在字符串的最后一个字符之后,如果最后一个字符是单词字符。
  • 在字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。

当模式包含单词字符、字母、数字或字符时,"\\b&&\\b"模式匹配。&&_

要匹配空白边界,您可以使用

gsub("(?<!\\S)&&(?!\\S)", "XXX", string2, perl=TRUE)

模式匹配

  • (?<!\\S) - 一个不紧跟在非空白字符前面的位置(即,必须在当前位置的左侧紧邻字符串或空白字符的开头)
  • &&- 文字子串
  • (?!\\S)- 一个不紧跟非空白字符的位置(即,当前位置的右侧必须有字符串结尾或空白字符)。

推荐阅读