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"  

配列の最後の 2 つの要素が一致しない理由がわかりません。

ありがとうございます。よろしくお願いします。

4

1 に答える 1

2

これはどう?

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

|:の前のパターンは、もちろん、で^(abc@abc)始まるかどうかをチェックします。abc@abc

or (左括弧)が先行するを|使用positive lookbehindして検索した後のパターンは、見つかった場合は に置き換えられます。abc@abcspace(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交換しました。お役に立てれば。

于 2013-03-07T10:23:22.613 に答える