gpt4 book ai didi

regex - 用于匿名电子邮件的正则表达式

转载 作者:行者123 更新时间:2023-12-01 03:58:34 24 4
gpt4 key购买 nike

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

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

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

最佳答案

这个怎么样?

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

之前的模式 | : ^(abc@abc)检查是否以 abc@abc 开头, 当然。
|之后的图案用途 positive lookbehind并搜索 abc@abc前面是 space( (左括号),如果找到,则替换为 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"

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

关于regex - 用于匿名电子邮件的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15268147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com