我在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"
我不知道为什么数组的最后两个元素不匹配?
谢谢你,并致以最诚挚的问候。
答案 0 :(得分:2)
这个怎么样?
gsub("^(abc@abc)|(?<=[ (])(abc@abc)", "anonym@anonym", tmp, perl=T)
|
之前的模式:^(abc@abc)
当然会检查以abc@abc
开头。
|
使用positive lookbehind
后的模式,并在abc@abc
或space
(左副词)之前搜索(
,如果找到,则替换为{{ 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"
部分被替换。希望这会有所帮助。