/ 正の先読み正規表現R - r、regex、先読み

正の先読み正規表現R - r、正規表現、先読み

私は次のコマンドでRで正規表現の先読みを試みます。

 sub(x = street.addresses, pattern = "\s((?i)Street|(?i)St\.?)(?=\sNE)", replacement = " St")

私の目標は、StreetをStに置き換えることです。スペースと方向性のあるNEが続きます( "Northeast"のように)。先読みはもっと簡単にはできないようですが、私はエラーにぶつかり続けます:

Error in sub(x = streets, pattern = "\s((?i)Street|(?i)St\.?)(?=\sNE)",:
invalid regular expression "s((?i)Street|(?i)St.?)(?=sNE)", reason
"Invalid regexp"

先読みせずにこれのバージョンは正常に動作しますRでは、検索/置換に何らかの先読みを追加するとすぐにエラーになります。同様に、grepのような他の正規表現R関数も同じ問題を抱えているようです。

その正規表現を以下のようなエンジンにコピー/ペーストしました。 https://regex101.com/ そしてそれはそこでうまくいくように思われるので、私は "混乱しています。

編集:

これが私のコンソールからの直接のコピーです:

> street.addresses <- c("23 Charles Street NE","23 Charles St. NE")
> new.vec <- sub(x = street.addresses, pattern = "\s((?i)Street|(?i)St\.?)
(?=\sNE)", replacement = " St")
Error in sub(x = street.addresses, pattern = "\s((?i)Street|(?i)St\.?)(?
=\sNE)",  :
invalid regular expression "s((?i)Street|(?i)St.?)(?=sNE)", reason
"Invalid regexp"

回答:

回答№1は1

あなたは使用する必要があります sub 先読みを使用したい場合は、Perlモードで次のようにします。

street <- "123 Hudson Street NE, New York, NY"
sub(x = street, pattern = "\s((?i)Street|(?i)St\.?)(?=\sNE)",
replacement = " St", perl=TRUE)

[1] "123 Hudson St NE, New York, NY"

デモ

ちなみに、パラメータを sub デフォルトの位置では、名前を省略して、より簡潔な呼び出しをすることができます。

sub("\s((?i)Street|(?i)St\.?)(?=\sNE)", " St", street, perl=TRUE)

回答№2の場合は1

実際には、打撃があなたが望むものであれば、あなたは積極的な先読みを必要としません。

street = c("2389 E. Myronga Street NE")
sub(x = street, pattern = "\s((?i)Street|(?i)St\.?)\sNE", replacement = " St")

出力:

sub(x = street、pattern = "s((?i)Street |(?i)St。?)sNE"、replacement = "St")
1 "2389 E. Myronga St NE"

ただし、次のように設定した場合は、ポジティブルックアラウンド(およびその他のPerl互換の正規表現(PCRE)機能)を使用できます。 PERL=TRUE 追加の議論として

sub(x = street, pattern = "\s((?i)Street|(?i)St\.?)(?=\sNE)", replacement = " St", perl=TRUE)

この違いの理由は、Rで使われている2種類の正規表現、拡張正規表現(デフォルト)とPerlによって使われているPerl風の正規表現があるからです。 perl = TRUER doc、また見てください regular-expressions.info/rlanguage)。