正则表达式匿名化电子邮件

时间:2013-03-07 10:02:22

标签: regex r

我在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"  

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

谢谢你,并致以最诚挚的问候。

1 个答案:

答案 0 :(得分:2)

这个怎么样?

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

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

|使用positive lookbehind后的模式,并在abc@abcspace(左副词)之前搜索(,如果找到,则替换为{{ 1}}。

这就是我得到的:(注意:我用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包装正则表达式,则可以使用()等特殊变量引用“捕获”。在这里,我们捕获了\\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" 部分被替换。希望这会有所帮助。