私は次のコマンドで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 = TRUE
(R doc、また見てください regular-expressions.info/rlanguage)。