수색…


소개

정규 표현식 ( "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" 않을 것입니다.


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow