2017-12-22 29 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")) 

, 나는 다음과 같은 오류를받을 수 있나요

^(? =. * 또는^(?!

예를 들어 단어 경계가 두 개의 백래시 (예 : \ B가 아니라 \ 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

lookahead 패턴을 작동 시키려면'perl = TRUE'를 추가하십시오. 또한 체코 어 정규 표현식은 "^ (? =. * REP). * (?: CZECH (? : IA)? BOHEMIA)"처럼 보이길 원합니다. " –

+0

고마워, Wiktor. Perl은 나에게 발생하지 않았지만 트릭을 수행 한 것 같습니다. 왜 체코 어 정규 표현식을 바꾸어야 했습니까? – SCW

+0

그냥 습관의 힘. 나는'^ (? =. * REP). *'가'CZECH | CZECHIA | BOHEMIA'의 모든 대안을 언급했다고 생각했습니다. –

답변

1

(?=.*REP) 구조는 긍정적 인 미리보기이며 기본 R Rge 엔진 (TRE)에서 지원되지 않습니다. 패턴을 처리하려면 PCRE 정규식 엔진을 사용하도록 perl=TRUE을 사용해야합니다.

그러나, ^(?=.*REP).*CZECH|CZECHIA|BOHEMIA이 TRE 정규식 엔진을 사용하도록 다시 작성 될 수 있습니다 : 당신이 1 개 이상의 긍정적 예측이있는 경우

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

, 이러한 접근 방식은 지루한 증명할 수있는, 그것은 사실입니다 더 비효율적이다.