2017-02-14 6 views
1

텍스트 파일이 있는데 패턴을 추출하려고합니다. 펄에서, $ 1을 일치와 함께 사용했습니다. What does $1 mean in Perl?펄에서와 같이 R에 패턴 일치 및 캐칭 기능이 있습니까?

R에 비슷한 기능이 있는지 궁금합니다. 여기에 내가 내가하고 싶은 것을

a=readLines('xxx.txt') 
"{1:F21CRESUS33XLIQ9590112170}{2:O1030747170228BNPAGB22XCIT95901121701702280629U}{3:{103:GLBH}}{4" 
[914] ":20:PK836J9GD2HI7SWQ"                    
[915] ":23B:CRED"                      
[916] ":32A:170214USD2154,252"                   
[917] "50:ABNYUS33XXXX"                     
[918] "/1Jose Lugo"                      
[919] "/2931 Corte De Luna"                    
[920] "/3 Seattle"                      
[921] "/498104, United States"                   
[922] "59F:BPAHCUHHXXXX"                     
[923] "/1 Jossef Goldberg"                    
[924] "/21220 Bradford Way"                    
[925] "/3 Seattle"                      
[926] "/498104, United States"                   
[927] ":71A:OUR"                       
[928] "-}"                        
[929] "{1:L01BARCGB21X05G7115765182}{2:O1030946170226ABBYGB2LXXXX71157651821702261046S}{3:{103:WJHX}}{4" 
[930] ":20:YZDSKFJNXV4BE3MP"                    
[931] ":23B:CRED"                      
[932] ":32A:170214USD63362,31"                   
[933] "50:ABBYGB2LXXXX"                     
[934] "/1Jossef Goldberg"                    
[935] "/21220 Bradford Way"                    
[936] "/3 Seattle" 

을 의미 샘플 조건을 테스트입니다 특정 문자와 라인 별, 그것은 다른 패턴이 포함되어 있는지 확인하기 위해 라인을 검색하고 $ $를 당기면 그 out (perl에서와 같이). 의사에서

:

pattern1='^{1:' 
pattern2='CU' 
if (!is.null(line)){ 
    if(grep(pattern1, line)){ 
    if(grep(pattern2,line)){ print(substr(line,a,b), plus some other patters if they match the regex) 
    }      
    } 
} 

나는 또한 내가이 라인을 통해, 내가 \n와 라인에 합류 제안

+0

어쩌면'x <- paste0 (a, collapse = "\ n")'과 같은 것일 수도 있습니다. 'regmatches (x, gregexpr ("(? sm :^{1. *? CU) :. *) ", x, perl = TRUE))'? –

+1

이것은 정말로 'perl'질문이 아닙니다. 맞습니까? – Sobrique

+0

는 Wiktor를 사용합니다. ? sm :와? s : gregexpr에서 무엇을 의미합니까? 감사합니다. – alex

답변

2

먼저 읽기 시작하기 시작 얻을 수있는 방법 궁금 :

x <- paste0(a, collapse = "\n") 

그런 다음 일치 항목을

regmatches(x, gregexpr("(?sm:^{1.*?CU)(?-s:.*)", x, perl=TRUE)) 
라인의 시작 ( ^?m이 동작을 가능으로 라인 위치를 시작 일치), 다음 {1 리터럴 문자 시퀀스를 다음 .*? 어떤 공을 일치합니다 -

  • (?sm:^{1.*?CU)을 :

    (?sm:^{1.*?CU)(?-s:.*) 16,는 일치하는 정규식 패턴입니다 + 문자 처음 CU

  • (?-s:.*)까지 (*? 게으른 정량이기 때문에) 가능한 몇 배 ((?s). 경기 개행을 포함한 모든 심볼을 만들면서 참조) - .*은 나머지 줄과 일치합니다 ((?-s:) 그룹은 이전에 (?s)에 의해 활성화 된 DOTALL 수정자를 끕니다).