본문 바로가기
통계프로그램 비교 시리즈/오라클함수 비교(R & Python)

REGEXP_SUBSTR 오라클 함수 [Oracle, Pandas, R Prog, Dplyr, Sqldf, Pandasql, Data.Table, DuckDB]

by 기서무나구물 2021. 12. 14.

포스팅 목차

    * 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크


    [ REGEXP_SUBSTR Oracle Function ]

     


    REGEXP_SUBSTR 함수는 입력한 문자열에서 지정한 정규식 패턴을 검색하여서 지정한 패턴(정규 표현식)과 일치하는 부분의 문자열을 반환한다. REGEXP_SUBSTR함수는 정규 표현식 패턴을 통하여 문자열을 검색할수 있도록 REPLACE 함수의 기능을 확장한 것이다. REGEXP_INSTR과 유사하나, substring의 위치를 반환하는 것이 아니라, substring 문자열 자체를 반환한다. 이 함수는 패턴과 일치하는 문자열의 위치는 필요하지 않고, 문자열의 내용이 필요한 경우에 유용하다. 함수는 source_string으로써 같은 문자 세트안에서 VARCHAR2 또는 CLOB 데이터와 같은 문자열을 반환한다.

     

     

     


    1. Oracle(오라클)

     

    REGEXP_SUBSTR() 함수

    다음 예제는 문자열을 검색하여서 쉼표를 기준으로 구분된 문자열 중에서 처음에 위치한 문자열(substring)을 검색한다. 정규 표현식 패턴은 이 작업을 위하여 쉼표사이에 쉼표 이외의 문자가 1개 이상 존재하는 문자열을 검색한다. 앞뒤에 존재하는 쉼표를 포함한 문자열을 반환한다.

     

    Oracle Programming
    SELECT REGEXP_SUBSTR('500 Oracle Parkway, Redwood Shores, CA',
                         ',[^,]+,') "REGEXPR_SUBSTR"
    FROM   DUAL;

     

    Results
    REGEXPR_SUBSTR
    
    , Redwood Shores,

     

     


    2. Python Pandas(파이썬)

     

    정규표현식과 re.search() 함수

    지정한 정규표현식 패턴과 일치하는 문자열 중에서 처음에 위치한 문자열을 반환한다.

     

    Python Programming
    import re
    m = re.search(',[^,]+,', '500 Oracle Parkway, Redwood Shores, CA')
    m.group(0)

     

    Results
    ', Redwood Shores,'

     


    re.findall() 함수

    지정한 정규표현식 패턴과 일치하는 모든 문자열을 리스트 형태로 반환한다.

     

    Python Programming
    re.findall(',[^,]+,', '500 Oracle Parkway, Redwood Shores, CA')

     

    Results
    [', Redwood Shores,']

     


    pandas.Series.str.extract

    : 지정한 패턴과 일치하는 문자열 중에서 처음에 위치한 문자열을 반환한다.

     

    Python Programming
    p = r'\b[a-z]\b'
    
    pd.DataFrame(['500 Oracle Parkway, Redwood Shores, CA'],columns=['col_str']).col_str.str.extract(r'(,[^,]+,)')

     

    Results
    	0
    0	, Redwood Shores,
     

    pandas.Series.str.extractall

    • : 지정한 패턴과 일치하는 모든 문자열을 반환한다.

     

    Python Programming
    p = r'\b[a-z]\b'
    
    pd.DataFrame(['500 ,Oracle Parkway, ,Redwood Shores, CA'],columns=['col_str']).col_str.str.extractall(r'(?P<pattern>\,[^,]+,)')

     

    Results
    		pattern
    match	
    0	0	,Oracle Parkway,
    	1	,Redwood Shores,
     

    re.search 함수

    : 지정한 패턴과 일치하는 문자열 중에서 처음에 검색된 문자열을 반환한다.

     

    Python Programming
    pd.DataFrame(['500 Oracle Parkway, Redwood Shores, CA'],columns=['col_str']).col_str.apply(lambda x: re.search(',[^,]+,', x).group(0)  ) 

     

    Results
    0    , Redwood Shores,
    Name: col_str, dtype: object

     

     


    3. R Programming (R Package)

     

    stringi::stri_extract_first_regex

    : 입력한 문자열에서 지정한 정규식 패턴을 검색하여서 지정한 패턴(정규 표현식)과 일치하는 문자열 중에서 처음에 검색된 문자열을 반환한다.

     

    R Programming
    %%R
    
    stringi::stri_extract_first_regex('500 Oracle Parkway, Redwood Shores, CA',',[^,]+,')

     

    Results
    [1] ", Redwood Shores,"

     


    stringr::str_extract

     

    R Programming
    %%R
    
    stringr::str_extract('500 Oracle Parkway, Redwood Shores, CA',',[^,]+,')

     

    Results
    [1] ", Redwood Shores,"

     


    stringi::stri_extract_all() 함수

     

    R Programming
    %%R
    
    stringi::stri_extract_all(regex = ",[^,]+,", "500 Oracle Parkway, Redwood Shores, CA")

     

    Results
    [[1]]
    [1] ", Redwood Shores,"

     


    • base::regmatches : regexpr, gregexpr 또는 regexec 함수에서 획득된 패턴 매칭 정보를 사용하여서 패턴과 일치하는 문자열을 추출하거나 교체합니다.
    • base::regexpr : 입력 문자열에서 지정한 정규식 패턴과 일치하는 문자열을 검색하고 지정한 패턴(정규 표현식)과 일치하는 문자열이 시작하는 인덱스와 일치하는 문자열의 길이를 반환한다.

    base::regexpr 함수로 패턴과 일치하는 문자열의 패턴 정보(위치와 길이 정보)를 추출하여서 base::regmatches 함수로 일치하는 문자열을 추출한다.

     

    R Programming
    %%R
    
    base::regmatches('500 Oracle Parkway, Redwood Shores, CA', base::regexpr(',[^,]+,', '500 Oracle Parkway, Redwood Shores, CA') )

     

    Results
    [1] 19
    attr(,"match.length")
    [1] 17
    attr(,"index.type")
    [1] "chars"
    attr(,"useBytes")
    [1] TRUE

     


    base::gregexpr

    : 입력 문자열에서 지정한 정규식 패턴과 일치하는 모든 문자열의 패턴 정보(위치와 길이 정도)를 반환한다.

     

    R Programming
    %%R
    
    base::gregexpr(',[^,]+,','500 Oracle Parkway, Redwood Shores, CA',perl=TRUE)

     

    Results
    [[1]]
    [1] 19
    attr(,"match.length")
    [1] 17
    attr(,"index.type")
    [1] "chars"
    attr(,"useBytes")
    [1] TRUE

     


    stringr::str_extract

    : 입력 문자열에서 지정한 정규식 패턴과 일치하는 문자열을 추출한다.

     

    R Programming
    %%R
    
    col_frame <- data.frame("col_str" = c("500 Oracle Parkway, Redwood Shores, CA")) 
    
    sapply(col_frame, function(x) stringr::str_extract(x, ",[^,]+,"))

     

    Results
       col_str 
    ",Oracle," 

     

     


    4. R Dplyr Package

     

    stringr::str_extract

    : 입력 문자열에서 지정한 정규식 패턴과 일치하는 문자열을 추출한다.

     

    R Programming
    %%R
    
    col_frame <- data.frame("col_str" = c("500 Oracle Parkway, Redwood Shores, CA")) 
    
    col_frame %>%
      dplyr::mutate( REGEXP_SUBSTR = stringr::str_extract(col_str,',[^,]+,') )

     

    Results
                                     col_str     REGEXP_SUBSTR
    1 500 Oracle Parkway, Redwood Shores, CA , Redwood Shores,

     


    5. R sqldf Package

     


    6. Python pandasql Package

     


    7. R data.table Package

     

    stringr::str_extract

    : 입력 문자열에서 지정한 정규식 패턴과 일치하는 문자열을 추출한다.

     

    R Programming
    %%R
    
    col_frame <- data.frame("col_str" = c("500 Oracle Parkway, Redwood Shores, CA")) 
    
    DT        <- data.table(col_frame)
    
    DT[, REGEXP_SUBSTR := stringr::str_extract(col_str,',[^,]+,') ]

     

    Results
                                      col_str     REGEXP_SUBSTR
    1: 500 Oracle Parkway, Redwood Shores, CA , Redwood Shores,

     


    [참고]

    패턴 구분자를 기준으로 문자열을 분할하여서 개별 변수를 생성한다.

    • data.table::tstrsplit 함수 : transpose(strsplit(…)) 과 동일한 역할을 수행

     

    R Programming
    %%R
    
    col_frame <- data.frame("col_str" = c("500 Oracle Parkway, Redwood Shores, CA")) 
    
    DT        <- data.table(col_frame)
    
    DT[, c("Col1", "Col2") := data.table::tstrsplit(col_str, ',[^,]+,')]

     

    Results
                                      col_str               Col1 Col2
    1: 500 Oracle Parkway, Redwood Shores, CA 500 Oracle Parkway   CA

     


    transpose() 함수

     

    R Programming
    %%R
    
    col_frame <- data.frame("col_str" = c("500 Oracle Parkway, Redwood Shores, CA")) 
    
    DT        <- data.table(col_frame)
    
    DT[, transpose(strsplit(col_str, ',[^,]+,'))]

     

    Results
                       V1  V2
    1: 500 Oracle Parkway  CA

     


    8. Python Duckdb의 SQL

     

    Python Programming
    %%sql
      SELECT regexp_extract('500 Oracle Parkway, Redwood Shores, CA',
                            ',[^,]+,') "REGEXPR_SUBSTR_1"

     

    Python Programming
    duckdb.sql(" SELECT regexp_extract('500 Oracle Parkway, Redwood Shores, CA',   \
                            ',[^,]+,') AS REG_SUBSTR ").df()

     

    Results
              REG_SUBSTR
    0  , Redwood Shores,

     


    Slicing kiwis (https://unsplash.com/photos/rJ236eQHXGA)

      --------------------------------------------  

     

     

    [Oracle, Pandas, R Prog, Dplyr, Sqldf, Pandasql, Data.Table] 오라클 함수와 R & Python 비교 사전 목록 링크

     

    오라클 SQL 함수(Oracle SQL Function) 목록 리스트 링크

     

    [SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 처리 방법 리스트 링크 링크
    반응형

    댓글