2017-12-22 6 views
-2

Rパッケージの "countrycode"には、 "country.name.en.regex"という変数も含まれているデータフレーム(countrycode_data)が含まれています。この変数には、国名またはそのバリエーションが特定の列にあるかどうかによって、TRUEまたはFALSEの新しい列を作成するために使用したい正規表現パターンが含まれています(下の例を参照)。パッケージの国コードと正規表現

AB <- c('CHINAS PARTY CONGRESS','JAPAN-US RELATIONS','JAPAN TRIES TO') 
TI <- c('AMERICAN FOREIGN POLICY', 'CHINESE ATTEMPTS TO', 'BRITAIN HAS TEA') 
AU <- c('AUTHOR 1', 'AUTHOR 2','AUTHOR 3') 
M <- data.frame(AB,TI,AU) 
M$Japan<- !!rowSums(sapply(M[c(1:3)], grepl, pattern ='JAPAN')) 

enter image description here

日本の正規表現は、もちろん非常に簡単です、しかし、より複雑な場合があります。私は今、提供されるすべての正規表現をテストし、動作しないものが

を含む傾向があることを認識している

Error in FUN(X[[i]], ...) : 
    invalid regular expression '^(?=.*REP).*CZECH|CZECHIA|BOHEMIA', reason 'Invalid regexp' 
> 

:たとえば、その場合には

> M$Czech_Republic<- !!rowSums(sapply(M[c(3, 7:9)], grepl, pattern ="^(?=.*REP).*CZECH|CZECHIA|BOHEMIA")) 

は、私は次のエラーを取得しますか

^(?=。*または^(?!

たとえば、単語の境界が2つのバックラッシュ(\ Bではなく元の\ B)でエスケープされていないことに気付きました。私が気付いていないソリューションですか?または別の代替アプローチですか?ここでは、エラーを返す正規表現の完全な例をいくつか示します:

M$China<- !!rowSums(sapply(M[c(3, 7:9)], grepl, pattern ="^(?!.*\\BMAC)(?!.*\\BHONG)(?!.*\\BTAI)(?!.*\\BREP).*CHINA|^(?=.*PEO)(?=.*REP).*CHINA")) 
M$United_States_of_America<- !!rowSums(sapply(M[c(3, 7:9)], grepl, pattern ="UNITED.?STATES\\B(?!.*ISLANDS)|\\BU\.?S\.?A\.?\\B|^\S*U\.?S\.?\\B(?!.*ISLANDS)")) 
M$Republic_of_Korea<- !!rowSums(sapply(M[c(3, 7:9)], grepl, pattern ="^(?!.*D.*P.*R)(?!.*DEMOCRAT)(?!.*PEOPLE)(?!.*NORTH).*\\BKOREA(?!.*D.*P.*R)")) 

ありがとう! SCW

+1

先読みパターンを動作させるには、 'perl = TRUE'を追加します。またチェコの正規表現は '' ^(?=。* REP)。*(?:CZECH(?:IA)?BOHEMIA)のように見えるはずです」「 –

+0

ありがとう、Wiktor。 Perlは私には起こりませんでしたが、それはやっているようです。なぜチェコの正規表現を変更しなければならなかったのですか? – SCW

+0

ちょうど習慣の力。私は '^(?=。* REP)。*'が 'CZECH | CZECHIA | BOHEMIA'のすべての選択肢を参照していると思いました –

答えて

1

(?=.*REP)の構文は正の先読みであり、既定のベースR正規表現エンジン(TRE)ではサポートされていません。それらを使用するには、perl=TRUEを使用してパターンを処理するためにPCRE正規表現エンジンを使用する必要があります。しかし

^(?=.*REP).*CZECH|CZECHIA|BOHEMIAはTRE正規表現エンジンを使用するように書き換えることができることを注意してください。

REP.*CZECH|CZECH.*REP|CZECHIA|BOHEMIA 
^^^^^^^^^^^^^^^^^^^^^ 

あなたは1つの肯定先読み以上のものを持っている場合は、このようなアプローチは、退屈な証明かもしれないが、それは事実でありますより非効率的である。