4

我在 R 中使用正则表达式

regexp <- "(^|[^([:alnum:]|.|_)])abc@abc.de($|[^[:alnum:]])"

在特定文本中查找电子邮件地址abc@abc.de并将其替换为anonym-mail-adress.

tmp <- c("aaaaabc@abc.debbbb",        ## <- should not be matched
      "aaaa abc@abc.de bbbb",      ## <- should be matched
      "abc@abc.de",                ## <- should be matched
      "aaa.abc@abc.de",            ## <- should not be matched
      "aaaa_abc@abc.de",           ## <- should not be matched
      "(abc@abc.de)",              ## <- should be matched
      "aaaa (abc@abc.de) bbbb")    ## <- should be matched


replacement <- paste("\\1", "anonym@anonym.de", "\\2", sep="")
gsub(regexp, replacement, tmp, ignore.case=TRUE)

结果我得到

> gsub(regexp, replacement, tmp, ignore.case=TRUE)
[1] "aaaaabc@abc.debbbb"         "aaaa anonym@anonym.de bbbb"
[3] "anonym@anonym.de"           "aaa.abc@abc.de"            
[5] "aaaa_abc@abc.de"            "(abc@abc.de)"              
[7] "aaaa (abc.abc.de) bbbb"  

不知道为什么数组的最后两个元素不匹配?

感谢你并致以真诚的问候。

4

1 回答 1

2

这个怎么样?

gsub("^(abc@abc)|(?<=[ (])(abc@abc)", "anonym@anonym", tmp, perl=T)

|:之前的模式当然会^(abc@abc)检查是否以 开头abc@abc

|使用positive lookbehind和搜索之后的模式abc@abcspaceor ((左括号)开头,如果找到,则替换为anonym@anonym.

这就是我得到的:(注意:我abc.abc在最后一个字符串中替换为abc@abc

[1] "aaaaabc@abc.debbbb"           "aaaa anonym@anonym.de bbbb"  
[3] "anonym@anonym.de"             "aaa.abc@abc.de"              
[5] "aaaa_abc@abc.de"              "(anonym@anonym.de)"          
[7] "aaaa (anonym@anonym.de) bbbb"

编辑:要解释您的正则表达式的问题,这似乎是该部分的问题:

[^([:alnum:]|.|_)]

我认为否定必须出现在每个|陈述中。此外,您应该使用[.]而不是.后者暗示任何字符。或者,我们可以通过删除所有不必要的字符来压缩这部分,而不是对您正在检查的每个字符使用否定|

[^.[:alpha:]_] # not a . or _ or any alphanumeric
# using gsub on it:
gsub("(^|[^.[:alpha:]_])abc@abc", " anonym@anonym", tmp)

# [1] "aaaaabc@abc.debbbb"           "aaaa anonym@anonym.de bbbb"  
# [3] " anonym@anonym.de"            "aaa.abc@abc.de"              
# [5] "aaaa_abc@abc.de"              " anonym@anonym.de)"          
# [7] "aaaa  anonym@anonym.de) bbbb"

你得到每一个abc@abc替换。但是,您abc@abc每次都会丢失该字符,因为您也在模式中检查它。因此,您必须使用捕获组。也就是说,如果您使用()then 包装正则表达式,您可以使用特殊变量(例如\\1, \\2 etc... 在这里,我们已经捕获了(^|[^.[:alpha:]_]),即之前的部分abc@abc。由于这是第一次捕获,我们将其称为\\1使用它来恢复先前结果中丢失的字符:

gsub("(^|[^.[:alpha:]_])abc@abc", "\\1anonym@anonym", tmp)

# [1] "aaaaabc@abc.debbbb"           "aaaa anonym@anonym.de bbbb"  
# [3] "anonym@anonym.de"             "aaa.abc@abc.de"              
# [5] "aaaa_abc@abc.de"              "(anonym@anonym.de)"          
# [7] "aaaa (anonym@anonym.de) bbbb"

这是您需要的结果。这与我使用正面后视的最初答案相同。在这种情况下,因为它只是检查它是否前面有一些东西,所以你不必捕获任何特殊的东西。只是abc@abc更换了零件。希望这可以帮助。

于 2013-03-07T10:23:22.613 回答