2016-04-16 8 views
1

の末尾に単語バリエーションを削除します。R GSUB私は、次のベクトル持っている唯一の文字列

a <- c("SOCORRO SANTANDER", "SANTANDER DE QUILICHAO", 
     "LOS PATIOS NORTE DE SANTANDER", "LOS PATIOS NTE DE S DER") 

をし、「SANTANDER」の出現をすべて削除する必要がありますか(既存の場合、およびNORTEまたはその略語の前に)それは略語です文字列の末尾にの場合はのみです。 (それが失敗した理由をコメントで)

は、これまで私が試してみた:

gsub("(.*)(N.*DER$)", "\\1", a)  # Fails at SOCORRO 
gsub("(.*)(N.*DER$| DER$)", "\\1", a) # Only removes DER at LOS PATIOS 
gsub("(.*)([ N.*DER$]|[ DER$])", "\\1", a) # Removes trailing R (??) 
gsub("(.*)(N?.*DER$)", "\\1", a) # Fails removing " NTE DE S" and "NORTE DE" 

ので、特に、私は十分に文字列、が、より多くの不要な部分を削除する方法を知りたいです一般的にはこのような状況をテストする正規表現を作成する正しい方法を知りたいと思います(私の最初の執筆は「OR(|)をグループ内で使用する」ということでした)。

期待される結果は次のとおりです。

a 
## [1] "SOCORRO" "SANTANDER DE QUILICHAO" "LOS PATIOS" "LOS PATIOS" 
+0

aは、試行3が後続のRだけを削除した理由を説明します。それは私を困惑させる!ありがとう。 – PavoDive

+0

出力を得るには、 'gsub("(?:SOCORRO)?(。*?)(N. * DER $)? "、" \\ 1 "、a)'があります。私は他にもたくさんあると確信しています。 – lukeA

+0

@lukeAあなたのコメントをいただきありがとうございます。私は例を単純化し、短くて再現性のあるものにするようにしました。実際のデータには、SOCORROの他にも多くの町の名前があります。 – PavoDive

答えて

1

我々はgsub()を必要としない

sub("(.*)(\\s+N.*(DER)$)|\\s+SANTANDER$", "\\1", a) 
#[1] "SOCORRO"    "SANTANDER DE QUILICHAO" "LOS PATIOS"    
#[4] "LOS PATIOS"  

それとも

sub("\\s+(N(\\S+\\s+){1,}|)\\S*DER$", "", a) 
#[1] "SOCORRO"    "SANTANDER DE QUILICHAO" "LOS PATIOS"    
#[4] "LOS PATIOS" 
2
sub('(\\s*\\b(NORTE\\s+DE|NTE\\s+DE))?\\s*\\b(SANTANDER|S\\s+DER)$','',a); 
## [1] "SOCORRO" "SANTANDER DE QUILICHAO" "LOS PATIOS" "LOS PATIOS" 
  • を試すことができ、同じ文字列内で複数回一致する必要はないからです。
  • ブラケット式は1文字にのみ一致するため、この正規表現には適切ではありません。
  • ドル文字は、ブラケット式の外にあるときのみ特殊です。
  • あなたは、正規表現と完全長の単語の両方を同じ正規表現と一致させようとしたようです。これに対して私は助言するだろう。彼らは概念的に全く異なる部分です。単語とその省略形が接尾辞を共有する場合、それは状況です。その事実の周りに正規表現を構築すべきではありません。したがって、ここでは交替が最も適切だと思います。
+0

詳細な説明をありがとう。私はノートの負荷を取った。正規表現は、私たちのために難しいです、初心者、この種の詳細は私たちの理解を構築するのに役立ちます。私はあなたの時間を感謝します! – PavoDive

関連する問題