2015-01-07 3 views
14

나는 list.files() 주변에 연주하고 난 010.csv를 통해서만 목록 001.csv 싶었 내가이 명령을 함께했다 :. * \의 목적은 무엇입니까?

list_files <- list.files(directory, pattern = ".*\\000|010", full.names = TRUE) 

이 코드는 내가 원하는 걸 제공하지만, 나는 완전히 무슨 일이 일어나고 있는지 이해가 안 돼요 pattern 인수와 함께. pattern = .*\\\000은 어떻게 작동합니까?

+3

어떻게 그 명령을 생각해 냈습니까? 나는 충격을 받았다. 나는 당신이 필요로하는 구체적인 방법에 따라''00 \\ d \\. csv | 010 \\. csv "'같은 것을 생각할 것입니다. – Gregor

+0

''\\ 0 "'이 유효한 정규식 이스케이프 였다고 생각하지 않았습니다. 단지"0 "으로 취급되지 않는 한 –

+1

그레고리, 나는 00 *, 0 * 0, * 00의 변형으로 시작했습니다. *. 어딘가에 대해 읽으십시오. 나는 그것이 실제로하는 것을 모른 채. * \로 어지럽 혔다. 이것은 단지 나를 위해 일하는 것을 끝내었다. – Chris

답변

14

\\0은 역 참조이므로 해당 점에 전체 정규식 일치를 삽입합니다. 것을 의미 할 수 있는지 다음을 비교 :

"001.csv" 또는 "009.csv" 같은 문자열
sub("he", "", "hehello") 
## [1] "hello" 
sub("he\\0", "", "hehello") 
## [1] "llo" 

, 무슨 일하면 .* 일치하는 문자를 제로 즉, \\0 그 제로 문자를 한 번 반복하고, 00 처음 두 일치 문자열의 0입니다. 성공!

이 패턴 은 그 두 배로 즉시 두 0의 뒤에 맞게 아무것도 찾을 수 없습니다 경기 "100.csv" 또는 "010.csv" 때문이다. 이 되겠지만, 1과 일치하기 때문에 "1100.csv"과 일치하고 두 배로 증가한 다음 두 개의 0을 찾습니다.

따라서, ".*\\000"xx00으로 시작하는 문자열과 일치합니다. 여기서 x은 0 개 이상의 문자로 구성된 부분 문자열을 나타냅니다. 즉, 두 번 반복 된 것과 일치하고 두 번 0에 의해 folllowed.

+1

'100.c'라는 파일은''. * 00 " '. * \\ 000 "'과 일치하지 않습니다. 그래서'\\ 0'은 효과가 있습니다. – unutbu

+0

나는이 테스트 문자열을 가지고 놀았다 :'c ("001.csv", "008.csv", "007.csv", "009.csv", "010.csv", "011.csv" "101.csv", "110.csv", "100.csv")' – Gregor

+0

@unutbu - 알았어, 도움이되는 포인터로 알았어. 감사. –

관련 문제