본문 바로가기
SAS/SAS 함수

【SAS 함수】 332. PRXPARSE

by 기서무나구물 2021. 10. 9.

포스팅 목차

    o PRXPARSE

     


    Perl 정규식 함수에 의해 이용될 Perl 정규식 표현을 정의 한다.

    Category: 문자열 비교 함수(문자열 매칭, Character String Matching)

     


    문 법


    regular-expression-id=PRXPARSE (perl-regular-expression)

    Arguments

         regular-expression-id

              는 PRXPARSE 함수에 의해 반환되는 인식자.

     


    참 고

    * PERL 문법

      - Using Perl Regular Expressions in the DATA Step

    SAS regular 형식 은 RX로 시작하고, Perl regular형식은 PRX로 시작한다.

    좀 더 상세한 사항을 알고 싶으신 분은 PERL언어에 관하여 찾아보시기를 바랍니다.

    * PERL : 자료를 추출하고 그에 의거한 보고서를 작성하는데 사용하는 프로그래밍언어 가운데 하나이다.

     

    PRXPARSE("/cat/") "The cat is black" "cots" cat이 들어간 위치
    PRXPARSE("/^cat/") "cat on the roof" "The cat" 첫 번째 cat 위치
    PRXPARSE("/cat$/") "There is a cat" "cat in the house" 마지막 cat 위치
    PRXPARSE("/cat/i") "The Cat" "no dogs allowed" 대소문 구분없이 cat
    PRXPARSE("/r[aeiou]t/") "rat","rot","rut" "rt","rxt"  
    PRXPARSE("/\d\d\d/") "345","999".. "1234","99" 3자리 숫자
    PRXPARSE("/\d\d\d?/") "123","12" "1","1AB","1 9" 2자리 또는 3자리 숫자
    PRXPARSE("/\d\d\d+/") "123","12345" "12X" 3자리 이상 숫자
    PRXPARSE("/\d\d\d*/") "123","12","12345" "1","xyz" 2개 이상의 숫자
    PRXPARSE("/(\d|x)\d/") "56","x9" "9x","xx" (숫자또는x)+숫자
    PRXPARSE("/[^a-e]\D/") "fx","9","AA" "aa","99","b%" (처음a-e가아닌문자)+(비숫자문자)
    PRXPARSE("/^\/\///") "//sysin dd *" "the // is here" 첫 위치에 //
    PRXPARSE("/^\/(\/|\*)/") "//" or "/*" in cols 1 and 2 "123 /*" 첫 위치에 // 또는 /* 문자
    PRXPARSE("/#//#/") "//" "/*" // 문자
    PRXPARSE("/\/\//") "//" "/*" // 문자
    PRXPARSE("/[\d\d]/") "12" "ab" 2자리 숫자
    PRXPARSE("/<cat>/") "the cat is black" "cots"  

     

    메타 캐릭터 설명
    \    그 다음 문자를 특수 문자, 리터럴, 역참조(반복되는 문자 그룹을 찾는 편리한 방법을 제공하며, 동일한 문자열을 다시 찾기 위한 간단한 명령), 또는 8진수 이스케이프로 표시합니다. 예를 들어,

    - 'n'은 문자 "n"을 찾는다.

    - '\n'은 줄 바꿈 문자를 찾는다.
    - '\\'는 "\"를 찾는다.
    - '\('는 "("를 찾는다.
    1  알파벳,숫자의 문자를 비교할 때 조건을 지정한다.
    ^  입력 문자열의 시작 위치를 찾는다.

    - ^cat는 ‘cat','cats’는 일치하나,‘the cat'는 일치하지 않는다.
    $  입력 문자열의 끝 위치를 찾는다.

    - cat$는 ‘the cat'은 일치하나, ‘cat in the hat'은 일치하지 않는다.
    *  부분식의 선행 문자를 0개 이상 찾는다. - 'zo*'는 "z", "zoo"등을 찾는다.

    - *는 {0,}과 동등하다.
    - cat*은 ‘cat','cats','catanddog'와 일치한다.
    - c(at)*은 ‘c','cat','catatat'와 일치한다.
    +  부분식의 선행 문자를 한 개 이상 찾는다.

    - “zo+”는 "zo", "zoo" 등을 찾는다.
    - “zo+"가 "z"는 아니다. - +는 {1,}와 동등하다.
    - \d+는 한 개 이상의 숫자와 일치한다.
    ?  부분식의 선행 문자를 0개 또는 한 개를 찾는다.

    - "do(es)?"는 "do" 또는 "does"에서 "do"를 찾는다.
    - ?는 {0,1}와 동등하다.
    - hello?는 ‘hell','hello'와 일치한다.
    {n}   n은 음이 아닌 정수로, 정확히 n개를 찾는다.

    - “o{2}”는 o가 2개인 “food”를 찾는다.
    - “o{2}" 는 "Bob"를 찾지 않는다.
    - \d{5}는 5자리 숫자와 일치한다.(\d\d\d\d\d)
    {n,}   n은 음이 아닌 정수로, n개 이상을 찾는다. - “o{2,}”는 “foooood"에서 o가 2개 이상인 모든 'o' 를 찾는다.

    - “o{2,}”는 "Bob"에서 ‘o'를 못찾는다. - “o{1,}”는 “o+"와 동등하다.
    - “o{0,}" 는 "o*"와 동등하다.
    - \w{3,}은 ‘cat','_NULL_'과 일치한다.(\w\w\w+)
    {n,m}   m과 n은 음이 아닌 정수로(n<=m), 최소 n개, 최대 m개 찾는다.

    - "o{1,3}"은 "gooooood"의 처음 세 개의 'o'를 찾는다.
    - "o{0,1}"은 "o?"와 동등하다.
    - \w{3,5}은 ‘abc','abcd','abcde'와 일치한다.

    [참고] 쉼표와 숫자 사이에는 공백을 넣을 수 없다.
    period(.)   새줄을 제외하고 모든 단일 문자를 찾는다. 새로운 줄(newline)을 포함한 모든 단일 문자를 찾기위해서는 “[.\n]"과 같은 패턴을 이용하라.

    - r.n은 ‘ron','run','ran'과 일치한다.
    (pattern)   패턴을 찾아서 매칭하는 것에 대해 캡쳐 퍼버를 생성한다. 캡쳐버퍼에서 위치와 length를 검색하기 위하여, CALL PRXPOSN을 이용하라. 캡쳐버퍼의 값을 검색하기 위해, PRXPOSN함수를 이용하라.

    - 괄호문자를 찾기위해서, "\(" 또는 "\)"를 사용하라.
    (?:pattern)   패턴을 찾지만 검색한 문자열을 캡쳐하지 않는다.즉, 검색한 문자열을 나중에 사용할수 있도록 저장하지 않는 비캡쳐 검색이다. 이것은 패턴의 일부를 “or" 문자(|)로 묶을 때 유용하다.

    - "industr(?:y|ies)는 “industry|industries'보다 더 경제적이다.
    (?=pattern)   포함 예상 검색은 pattern과 일치하는 문자열이 시작하는 위치에서 검색할 문자열을 찾는다. 검색한 문자열을 나중에 사용할수 있도록 캡쳐하지 않는 비캡쳐검색이다. 예상 검색은 검색할 문자열을 찾은 후 예상 검색 문자열을 구성하는 문자 다음부터가 아니라 마지막으로 검색한 문자열 바로 다음부터 검색하기 시작한다.

    - “Windows(?=95|98|NT|2000)"는 ”Windows 2000"의 “Windows"는 찾지만, ”Windows 3.1"의 Windows"는 찾지 않는다.
    (?!pattern)   제외 예상 검색은 pattern과 일치하지 않는 문자열이 시작하는 위치에서 검색할 문자열을 찾는다. 이것은 검색한 문자열을 나중에 사용할 수 있도록 캡쳐하지 않는 비캡쳐 검색이다. 제외 예상 검색은 검색할 문자열을 찾은 후, 제외 예상 검색 문자열을 구성하는 문자 다음부터가 아니라 마지막으로 검색한 문자열 다음부터 검색하기 시작한다.

    - “Windows(?!95|98|NT|2000)"는 ”Windows 3.1의 “Windows"는 찾지만, “Windows 2000"의 Windows"는 찾지 않는다.
    x|y   x 또는 y를 찾는다. - "z|food" 는 "z" 또는 "food"를 찾는다.

    - "(z|f)ood"는 "zood" or "food"를 찾는다.
    - c(a|o)t는 'cat','cot'는 일치한다.
    [xyz]   괄호안의 문자중에서 일치하는 문자 집합을 찾는다.

    - "[abc]"는 "plain"안의 "a"를 찾는다.
    - ca[tr]은 ‘cat','car'과 일치한다.
    [^xyz]   괄호 밖의 문자중에서 일치하는 문자 집합이 아닌 것을 찾는다.

    - "[^abc]"는 "plain"에서 “p"를 찾는다.
    - [^8]\d\d는‘123’,‘999’와 일치하나, ‘800’은 일치하지 않는다.
    [a-z]   지정한 범위 안의 문자를 찾는다.

    - "[a-z]"는 “a"에서부터 "z"사이의 모든 소문자를 찾는다.
    - [a-e]\D+ 는 'adam','edam','car'와 일치한다.
    - [a-eA-E]\w+는 'Adam','edam','B13'과 일치한다.
    [^a-z]  지정한 범위 밖의 문자를 찾는다.

    - "[^a-z]"는 “a"에서부터 "z" 사이에 없는 문자를 찾는다.
    \b   단어의 경게, 즉 단어와 공백 사이의 위치를 찾는다.

    - "er\b"는 “never"에서 "er"을 찾는다.
    - "er\b"는 “verb"에서 “er"은 찾지 못한다.
    \B   단어의 비경계를 찾는다.

    - "er\B"는 “verb"에서 "er"을 찾는다.
    - "er\B"는 “never"에서 "er"은 찾지 못한다.
    \d  숫자문자를 찾는다.([0-9])

    - \d\d\d는 3자리 숫자문자와 일치한다.
    \D  비숫자문자를 찾는다.([^0-9])

    - \D\D는 ‘xx','ab','%%'와 일치한다.
    \s  공백문자를 찾는다.([\f\n\r\t\v])

    - \d+\s+\d+는 “123 4”와 일치한다.
    \S  비공백문자를 찾는다.([^\f\n\r\t\v])
    \t  탭문자를 찾는다.("\x09")
    \w  밑줄을 포함한 모든 단어 문자를 찾는다.([A-Za-z0-9_])
    \W  비단어 문자를 찾는다.([^A-Za-z0-9_])
    \num  양의 정수값을 찾는다. 캡쳐한 문자열에 대한 역참조이다.

    - "(.)\1"은 연속적으로 나오는 동일한 문자 두 개를 찾는다.
    \(  ‘(’ 문자를 찾는다.

    - \(\d\d\d\)는 ‘(123)’과 일치한다.
    \)  ‘)’ 문자를 찾는다.
    \\  ‘\’ 문자를 찾는다. \D \\ |D는 “the \ character'과 일치한다.
    \1  이전 캡쳐와 일치하고, back reference(역참조)를 호출한다.

    - (\d\D\d)\1은 ‘9a99a9'는 일치하나, ’9a97b7'은 일치하지 않는다.

     


    관련 함수

    함수명 함수내용
    CALL PRXCHANGE 지정한 패턴과 일치하는 문자열을 검색하여 검색된 부분을 변경하기 원하는 대체 문자열로 변경 작업을 수행한다.
    CALL PRXDEBUG PERL 정규식이 컴파일 되는 과정과 패턴이 문자값과 일치 될 때 반환되는 값에 대한 정보를 제공한다.
    CALL PRXFREE 메모리에 할당된 Perl regular 표현식을 초기화 한다. 일반적으로 데이터 스텝이 종료되면 리소스가 초기화 된다.
    CALL PRXNEXT 문자열에서 지정한 패턴과 일치하는 패턴 검색 작업을 반복적으로 수행하여서 패턴과 일치하는 하위 문자열의 위치와 length를 반환한다.
    CALL PRXPOSN capture 버퍼의 시작 위치와 length를 반환한다.
    CALL PRXSUBSTR 패턴이 일치하는 문자열의 위치와 length를 반환한다.
    PRXCHANGE 지정한 패턴과 일치하는 경우 변경 작업을 수행한다.
    PRXMATCH 패턴 일치여부를 검색하고, 패턴이 발견된 첫 번째 위치를 반환한다.
    PRXPAREN 패턴이 일치하는 마지막 캡쳐 버퍼의 값을 반환한다.
    PRXPARSE Perl 정규식 함수에 의해 이용될 Perl 정규식 표현을 정의 한다.
    PRXPOSN capture 버퍼에 할당된 값을 반환한다. 캡쳐 버퍼는 prxparse를 통해 패턴 선언시 괄호를 지정하여 나눌수 있다.

     


    예 제

    prxparse함수를 이용하여서 패턴을 정의한다. 패턴은 ave, avenue, dr, drive, rd, road 의 단어를 검색하여 패턴이 일치하는 것의 위치를 찾는다.

    call prxsubstr함수는 패턴이 일치하는 곳의 위치와 Length를 찾아서 반환하여 substr함수를 사용하여 패턴이 일치하는 단어를 반환받게 된다.

    여기서 /i 옵션은 패턴 검색시 대소문자를 구분하지 않고 찾으라는 옵션이다.

    SAS Statements
    data _null_;
         if _N_ = 1 then do;
            retain patternID;
            pattern = "/ave|avenue|dr|drive|rd|road/i";
            patternID = prxparse(pattern);
         end;
    
         input street $80.;
    
         call prxsubstr(patternID, street, position, length);
    
         if position ^= 0 then do;
            match = substr(street, position, length);
            put match:$QUOTE. "found in " street:$QUOTE.;
         end;
    datalines;
    153 First Street
    6789 64th Ave
    4 Moritz Road
    7493 Wilkes Place
    ;

     

    Results
    "Ave" found in "6789 64th Ave"
    "Road" found in "4 Moritz Road"

     


    SAS 함수(SAS Function) 리스트 링크

     

    엑셀(EXCEL)과 SAS 함수(SAS Function) 비교 리스트 링크

     

    SAS 데이터 스텝 구문 리스트(SAS Data Step Statement)
    반응형

    'SAS > SAS 함수' 카테고리의 다른 글

    【SAS 함수】 334. PTRLONGADD  (0) 2021.10.10
    【SAS 함수】 333. PRXPOSN  (0) 2021.10.10
    【SAS 함수】 331. PRXPAREN  (0) 2021.10.09
    【SAS 함수】 330. PRXMATCH  (0) 2021.10.09
    【SAS 함수】 329. PRXCHANGE  (0) 2021.10.08

    댓글