R Language
정규식 (정규식)
수색…
소개
정규 표현식 ( "regex"또는 "regexp"라고도 함) 은 문자열과 일치 할 수있는 패턴을 정의 합니다 . 공식 R 문서를 보려면 ?regex
를 입력하고 자세한 정보는 Regex Docs 를 참조하십시오. SO 정규 표현식 / 주제에서 배울 수없는 가장 중요한 '잡아'는 대부분의 R-regex 함수가 pattern
매개 변수에서 이스케이프하기 위해 쌍을 이루는 백 슬래시를 사용해야한다는 것입니다.
비고
문자 클래스
-
"[AB]"
는 A 또는 B 일 수 있습니다. -
"[[:alpha:]]"
는 어떤 문자 일 수도 있습니다 -
"[[:lower:]]"
는 소문자를 나타냅니다."[az]"
는 가깝지만 일치하지 않습니다. 예 :ú
. -
"[[:upper:]]"
는 대문자를 나타냅니다."[AZ]"
는 가깝지만 일치하지 않습니다 (예 :Ú
. -
"[[:digit:]]"
은 0, 1, 2, ... 또는 9의 임의의 숫자를 나타내며"[0-9]"
와 같습니다.
한정 기호
+
, *
및 ?
정규식에서 평소와 같이 적용하십시오. - +
는 적어도 한 번 일치하고, *
는 0 번 이상 일치하며 ?
0 또는 1 시간과 일치합니다.
회선 표시기의 시작과 끝
문자열에서 정규 표현식의 위치를 지정할 수 있습니다.
-
"^..."
는 정규 표현식이 문자열의 시작 부분에 있도록합니다. -
"...$"
는 정규 표현식이 문자열의 끝에 오도록합니다.
다른 언어와의 차이점
R의 정규 표현식은 다른 언어에서 사용되는 정규 표현식과는 약간 다른 경우가 많습니다.
R은 더블 - 백 슬래시 이스케이프를 요구합니다 (
"\"
는 R 문자열에서 일반적으로 이스케이프를 의미하기 때문에). 예를 들어 대부분의 정규 표현식 엔진에서 공백을 캡처하려면 단순히\s
를 입력해야하고 R에서는\\s
를 입력해야합니다 .R의 UTF-8 문자는 대문자 U로 이스케이프되어야합니다. 예를 들어
[\U{1F600}]
및[\U1F600]
match와 일치하지만, 예를 들어 Ruby에서는 소문자 u와 일치합니다.
추가 리소스
다음 사이트 reg101 은 R 스크립트를 사용하기 전에 온라인 정규식을 확인하기에 좋은 장소입니다.
R Programmming wikibook 에는 정규 표현식을 사용하는 많은 예제가있는 텍스트 처리 전용 페이지가 있습니다.
공백 제거
string <- ' some text on line one;
and then some text on line two '
공백 자르기
"공백 제거"는 일반적으로 문자열에서 선행 공백과 후행 공백을 제거하는 것을 말합니다. 이전 예제의 조합을 사용하여 수행 할 수 있습니다. gsub
는 선행 및 후행 모두에 대해 강제로 교체하는 데 사용됩니다.
R 3.2.0 이전
gsub(pattern = "(^ +| +$)",
replacement = "",
x = string)
[1] "some text on line one; \nand then some text on line two"
R 3.2.0 이상
trimws(x = string)
[1] "some text on line one; \nand then some text on line two"
선행 공백 제거
R 3.2.0 이전
sub(pattern = "^ +",
replacement = "",
x = string)
[1] "some text on line one; \nand then some text on line two "
R 3.2.0 이상
trimws(x = string,
which = "left")
[1] "some text on line one; \nand then some text on line two "
후행 공백 제거
R 3.2.0 이전
sub(pattern = " +$",
replacement = "",
x = string)
[1] " some text on line one; \nand then some text on line two"
R 3.2.0 이상
trimws(x = string,
which = "right")
[1] " some text on line one; \nand then some text on line two"
모든 공백 제거
gsub(pattern = "\\s",
replacement = "",
x = string)
[1] "sometextonlineone;andthensometextonlinetwo"
탭 ( \t
), 개행 ( \r
및 \n
) 및 공백과 같은 공백 문자도 제거됩니다.
"YYYYMMDD"형식으로 날짜 유효성 검사
접두사로 날짜를 사용하여 YYYYMMDD
형식의 파일 이름을 지정하는 것이 일반적입니다 (예 : 20170101_results.csv
. 이러한 문자열 형식의 날짜는 다음 정규식을 사용하여 확인할 수 있습니다.
\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])
위의 표현식은 연도 : 0000-9999
, 01-12
사이의 월 및 01-31
일을 고려 01-31
.
예 :
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "20170101")
[1] TRUE
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "20171206")
[1] TRUE
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "29991231")
[1] TRUE
참고 : 날짜 구문이 유효한지 확인하지만 올바른 구문으로 잘못된 날짜를 지정할 수 있습니다 (예 : 20170229
(2017 년은 윤년이 아님).
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "20170229")
[1] TRUE
날짜를 확인하려면이 사용자 정의 함수를 통해 수행 할 수 있습니다.
is.Date <- function(x) {return(!is.na(as.Date(as.character(x), format = '%Y%m%d')))}
그때
> is.Date(c("20170229", "20170101", 20170101))
[1] FALSE TRUE TRUE
미국 미국 우편 약어 확인
다음 regex
은 50 개 주와 Commonwealth / Territory를 포함합니다 ( www.50states.com 참조).
regex <- "(A[LKSZR])|(C[AOT])|(D[EC])|(F[ML])|(G[AU])|(HI)|(I[DLNA])|(K[SY])|(LA)|(M[EHDAINSOT])|(N[EVHJMYCD])|(MP)|(O[HKR])|(P[WAR])|(RI)|(S[CD])|(T[NX])|(UT)|(V[TIA])|(W[AVIY])"
예 :
> test <- c("AL", "AZ", "AR", "AJ", "AS", "DC", "FM", "GU","PW", "FL", "AJ", "AP")
> grepl(us.states.pattern, test)
[1] TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE
>
참고 :
50 개 state.abb
하려면 R- 데이터 세트 state.abb
from state
를 사용하는 것이 좋습니다 (예 :
> data(state)
> test %in% state.abb
[1] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
AL, AZ, AR, FL
50 개 주 약칭에 대해서만 TRUE
입니다.
미국 전화 번호 확인
다음 정규식은 다음과 같습니다.
us.phones.regex <- "^\\s*(\\+\\s*1(-?|\\s+))*[0-9]{3}\\s*-?\\s*[0-9]{3}\\s*-?\\s*[0-9]{4}$"
+1-xxx-xxx-xxxx
형식으로 전화 번호의 유효성을 검사합니다. 각 번호 그룹의 시작 / 끝 부분에는 선행 / 후행 (선택 사항)을 포함하지만 중간에는 포함하지 않습니다 (예 : +1-xxx-xxx-xx xx
가 유효하지 않습니다. -
분리 문자는 공백으로 대체 될 수 있습니다 : xxx xxx xxx
또는 분리 문자없이 : xxxxxxxxxx
. +1
접두사는 선택 사항입니다.
그것을 확인하자 :
us.phones.regex <- "^\\s*(\\+\\s*1(-?|\\s+))*[0-9]{3}\\s*-?\\s*[0-9]{3}\\s*-?\\s*[0-9]{4}$"
phones.OK <- c("305-123-4567", "305 123 4567", "+1-786-123-4567",
"+1 786 123 4567", "7861234567", "786 - 123 4567", "+ 1 786 - 123 4567")
phones.NOK <- c("124-456-78901", "124-456-789", "124-456-78 90",
"124-45 6-7890", "12 4-456-7890")
유효한 경우 :
> grepl(us.phones.regex, phones.OK)
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
>
잘못된 경우 :
> grepl(us.phones.regex, phones.NOK)
[1] FALSE FALSE FALSE FALSE FALSE
>
참고 :
-
\\s
임의의 공백, 탭 또는 줄 바꿈 문자와 일치합니다.
R 정규식 패턴의 문자 이스케이프
R과 정규 표현식 모두 이스케이프 문자 "\"
공유하므로 grep
, sub
, gsub
또는 패턴 인수를 허용하는 다른 함수에 대한 올바른 패턴을 작성하려면 대개 백 슬래시를 쌍으로 사용해야합니다. 하나의 항목에 줄 바꿈이 있고 다른 탭 글자와 둘 중 하나가 아닌 3 개의 항목 문자 벡터를 만드는 경우 줄 바꿈이나 탭을 4 개의 공백으로 바꾸는 것이 좋습니다. 단 하나의 백 슬래시가 필요합니다. 그러나 매칭을 위해 백 슬래시가 짝을 이루어야합니다.
x <- c( "a\nb", "c\td", "e f")
x # how it's stored
# [1] "a\nb" "c\td" "e f"
cat(x) # how it will be seen with cat
#a
#b c d e f
gsub(patt="\\n|\\t", repl=" ", x)
#[1] "a b" "c d" "e f"
패턴 인수 (처음 나타나는 경우 선택적이며 부분 철자 만 필요함)는이 이중 또는 쌍을 필요로하는 유일한 인수입니다. 대체 인수는 이스케이프해야하는 문자를 두 배로 늘릴 필요가 없습니다. 모든 라인 피드와 4 공간 어커런스가 탭으로 바뀌면 다음과 같이됩니다.
gsub("\\n| ", "\t", x)
#[1] "a\tb" "c\td" "e\tf"
Perl과 POSIX 정규 표현식의 차이점
R에 구현 된 정규 표현식 엔진은 두 가지가 약간 있습니다. 기본값은 POSIX 일관성이라고합니다. R의 모든 정규식 함수에는 후자 유형을 설정하는 옵션이 있습니다. perl = TRUE
.
미리보기 / 뒤보기
perl = TRUE
는 정규 표현식에서 look-ahead와 look-behind를 가능하게합니다.
-
"(?<=A)B"
문자의 모양과 일치B
가 앞에 유일의 경우 , 즉A
"ABACADABRA"
일치 할 것이지만,"abacadabra"
와"aBacadabra"
않을 것입니다.