R 정규표현식 문자 분석

오늘은 R 정규표현식 문자 분석하는 방법에 대해 알아보겠습니다. 문자 파싱은 여러 다양한 형태를 요구하기 때문에 정규식을 제대로 이해하고 사용할 줄 알아야 텍스트 마이닝에서 좋은 데이타를 얻을 수 있습니다.

쉼표 등 특수 문자에 대한 정규표현식은 여기 링크를 참고바랍니다.

문자 or 숫자 하나

  • [:alnum:] → alpha + number
str_split(
  string = c("가나다abcABC123,.!@#$%^&*()/?456<>~+789"),
  pattern = "[:alnum:]"
)

#Output
[[1]] 
[1] ""               ""               ""               ""               ""               ""               ""               
[8] ""               ""               ""               ""               ""               ",.!@#$%^&*()/?" ""              
[15] ""               "<>~+"           ""               ""               ""
  • 특정 문자 포함한 문자 or 숫자
str_split(
  string = c("가나다abcABC123,.!@#$%^&*()/?456<>~+789"),
  pattern = "C[:alnum:]"
)

[[1]]
[1] "가나다abcAB"                "23,.!@#$%^&*()/?456<>~+789"
  • [:punct:] 구두점이 포함된 문자열 → , . ! @ # & * ( ) / ?
str_split(
  string = c("가나다abcABC123,.!@#$%^&*()/?456<>~+789"),
  pattern = "[:punct:]"
)

# Output
[[1]] 
[1] "가나다abcABC123" ""                ""                ""                ""                "$"               "^"               
[8] ""                ""                ""                ""                ""                "456<>~+789"

str_view_all(
  string = c("가나다abcABC123,.!@#$%^&*()/?456<>~+789"),
  pattern = "[:punct:]"
)

#Output
[1] │ 가나다abcABC123<,><.><!><@><#>$<%>^<&><*><(><)></><?>456<>~+789
  • [graph:] 구두점, 문자, 숫자가 포함된 문자열(공백문자는 미포함됨)
str_view_all(
  string = c("가나다abcA  BC123,.!@#$%^&*()/?456<>~+789"),
  pattern = "[:graph:]"
)

# Output
[1] │ <가><나><다><a><b><c><A>  <B><C><1><2><3><,><.><!><@><#><$><%><^><&><*><(><)></><?><4><5><6><<><>><~><+><7><8><9>
  • \\b : 문자열 내에서 특정 단어와 정확하게 일치하는 문자
str_view_all(
  string = c("가나다", "나다", "나다라", "가나다라마"),
  pattern = "\\\\b나다\\\\b"
)

# Output
[1] │ 가나다
[2] │ <나다>
[3] │ 나다라
[4] │ 가나다라마

[ ] 대괄호

  • [ ] 는 집합이나 범위를 표시합니다.
str_split(
  string = c("가나다\\nabc\\tABC\\n123\\t,.!@#$  %^&*()/ ?456<>~+789"),
  pattern = "[나b2#]"
)

[[1]]
[1] "가"                     "다\\na"                  "c\\tABC\\n1"              "3\\t,.!@"                "$  %^&*()/ ?456<>~+789"
str_split(
  string = c("가나다\\nabc\\tABC\\n123\\t,.!@#$  %^&*()/ ?456<>~+789"),
  pattern = "[a-c | A-B]"
)

[[1]]
[1] "가나다\\n"       ""               ""               "\\t"             ""               "C\\n123\\t,.!@#$" ""              
[8] "%^&*()/"        "?456<>~+789"

^ 제외 조건(대괄호 내)

  • ^ 기호는 대괄호 안에서 해당 문자열들을 제외함.
str_view_all(
  string = c("가나다\\nabc\\tABC\\n123\\t,.!@#$  %^&*()/ ?456<>~+789"),
  pattern = "[^나다abC3]"
)

# Output
[1] │ <가>나다<
    │ >ab<c><{\\t}><A><B>C<
    │ ><1><2>3<{\\t}><,><.><!><@><#><$>< >< ><%><^><&><*><(><)></>< ><?><4><5><6><<><>><~><+><7><8><9>

묶음 ( )

  • 문자열들을 개별이 아닌 하나로 취급함.
str_split(
  string = c("가나다\\nabc\\tABC\\n123\\t,.!@#$  %^&*()/ ?456<>~+789"),
  pattern = "(abc)"
)

# Output
[[1]][1] "가나다\\n"                                "\\tABC\\n123\\t,.!@#$  %^&*()/ ?456<>~+789"

^ 문자열의 시작점

  • 대괄호 없이 사용하면 문자열의 시작점을 의미함.
str_split(
  string = c("가나다\\nabc\\tABC\\n123\\t,.!@#$  %^&*()/ ?456<>~+789"),
  pattern = "^가"
)

#Output
[[1]][1] ""                                                 "나다\\nabc\\tABC\\n123\\t,.!@#$  %^&*()/ ?456<>~+789"

str_split(
  string = c("가나다\\nabc\\tABC\\n123\\t,.!@#$  %^&*()/ ?456<>~+789"),
  pattern = "^나"
)

#Output
[[1]]
[1] "가나다\\nabc\\tABC\\n123\\t,.!@#$  %^&*()/ ?456<>~+789"

$ 문자열의 종료점

  • 대괄호 없이 $는 문자열의 종료점을 의미함.
str_split(
  string = c("가나다\\nabc\\tABC\\n123\\t,.!@#$  %^&*()/ ?456<>~+789"),
  pattern = "9$"
)

# Output
[[1]]
[1] "가나다\\nabc\\tABC\\n123\\t,.!@#$  %^&*()/ ?456<>~+78" ""

str_split(
  string = c("가나다\\nabc\\tABC\\n123\\t,.!@#$  %^&*()/ ?456<>~+789"),
  pattern = "9$"
)

# Output
[[1]]
[1] "가나다\\nabc\\tABC\\n123\\t,.!@#$  %^&*()/ ?456<>~+789"
  • ^, $ 혼합하여 사용시
str_view_all(
  string = c("가나다", "나다", "나다라", "가나다라마"),
  pattern = "^나다라$"
)

# Output
[1] │ 가나다
[2] │ 나다
[3] │ <나다라>
[4] │ 가나다라마

연속되거나 비연속 문자열

  • (?=) 연속되는 문자열
# 뒤에 “a”가 있는 “가나다”
str_view_all(
  string = c("가나다abc가나다def"),
  pattern = "가나다(?=a)"
)

# Output
[1] │ <가나다>abc가나다def

# 뒤에 "a"가 없는 "가나다"
str_view_all(
  string = c("가나다abc가나다def"),
  pattern = "가나다(?!a)"
)

# Output
[1] │ 가나다abc<가나다>def
  • (?!=) 이어지지 않는 문자열
# 뒤에 "b"로 이어지지 않는 "가나다"
str_view_all(
  string = c("가나다abc가나다def"),
  pattern = "가나다(?!=b)"
)

# Output
[1] │ <가나다>abc<가나다>def
  • (?<=) 앞에서 이어지는 문자열
# 앞에 "c"가 있는 "가나다"
str_view_all(
  string = c("가나다abc가나다def"),
  pattern = "(?<=c)가나다"
)

# Output
[1] │ 가나다abc<가나다>def
  • (?<!) 앞에서 이어지지 않는 문자열
# 앞에 "c"가 없는 "가나다"
str_view_all(
  string = c("가나다abc가나다def"),
  pattern = "(?<!c)가나다"
)

# Output
[1] │ <가나다>abc가나다def

반복 일치

  • {n} 앞 글자가 n개 일치
str_view_all(  string = c("가가가나다abc가가나다def"),  pattern = "가{3}")

# Output
[1] │ <가가가>나다abc가가나다def
  • {n,} 앞 글자가 n개 이상 일치
str_view_all(
  string = c("가가가나다abc가가나다def"),
  pattern = "가{2,}"
)

# Output
[1] │ <가가가>나다abc<가가>나다def
  • 선행 요소가 n~m개 일치 {n,m}
str_view_all(
  string = c("가가가나다abc가가나다def가가가가나다ghi"),
  pattern = "가{3,4}"
)

# Output
[1] │ <가가가>나다abc가가나다def<가가가가>나다ghi
Back to top