2017-10-18 15 views
2

다음 예와 같이 일반적으로 연도를 일치 시키려면 어떻게해야합니까?정규식 : 여러 일치가있는 괄호에서 숫자 추출

a <- '"You Are There" (1953) {The Death of Socrates (399 B.C.) (#1.14)}' 
b <- 'Þegar það gerist (1998/I) (TV)' 

나는 다음을 시도했지만 가장 큰 성공을 거두지 못했습니다. 그것은 찾을 때까지 내가했던 생각 무엇

gsub('.+\\(([0-9]+.+\\)).?$', '\\1', a) 

가고 있었다 (숫자, 다음이 만들 수있는 그룹을 한 후 모든 문자는이 만날 때까지). 일치하는 항목이 여러 개인 경우 첫 번째 그룹을 추출합니다.

어디로 가야할지 제안 해주세요. R에서이 작업을 수행했습니다.

+0

예상되는 일치 항목은 '1953'과'1998 '입니다. a) 'sub. ("^. *? \\ ((\\ d {4}) [^)] * \\). *", "\\ 1", a)' –

+0

예, 미안합니다. . –

답변

1

패턴에 .+ 부분에 가능한 한 많은 문자가 일치하고, 가능한 한 패턴이 들어오는 문자열에서 마지막 4 자리 청크를 가져올 수 있습니다.

에서만 4 자리 숫자를 유지

^.*?\((\d{4})(?:/[^)]*)?\).* 

\1로 교체 사용할 수 있습니다. the regex demo을 참조하십시오.

세부

  • ^ - 문자열
  • 의 시작
  • .*? - 가능한 모든 0+ 문자로 몇
  • \( - (
  • (\d{4}) - 그룹 1 : 네 자리
  • (?: - 선택 사항 인 non-c 시작 apturing 기
    • / - /
    • [^)]* - )
  • )? 이외 0+ 문자 - ) (OPTIONAL은 생략 될 수있다)
  • - 그룹
  • \)
  • .* - 나머지 문자열.

    a <- c('"You Are There" (1953) {The Death of Socrates (399 B.C.) (#1.14)}', 'Þegar það gerist (1998/I) (TV)', 'Johannes Passion, BWV. 245 (1725 Version) (1996) (V)') 
    sub("^.*?\\((\\d{4})(?:/[^)]*)?\\).*", "\\1", a) 
    # => [1] "1953" "1998" "1996" 
    

    또 다른 기본 R 솔루션 ( 후 4 자리 숫자와 일치하는 것입니다 :

    regmatches(a, regexpr("\\(\\K\\d{4}(?=(?:/[^)]*)?\\))", a, perl=TRUE)) 
    # => [1] "1953" "1998" "1996" 
    

    \(\K\d{4} 패턴이 ( 일치 다음 인해 \K 경기에 방울

R demo 참조 재설정 연산자를 사용하고 (?=(?:/[^)]*)?\\)) 미리보기 헤드를 사용하면 / + 0+ ch ) 이외의 문자는 )입니다. regexpr은 첫 번째 일치 항목 만 추출합니다.

+0

고마워요, 그건 속임수입니다. 가능한 경우 5 분 안에 답을 확인하겠습니다. –

+0

'Johannes Passion, BWV'에서 올바른 해를 포착 할 수있는 방법이 있습니까? 245 (1725 판) (1996) (V) '도? 여기에 1996 년이 아니라 "1725"가수록되어 있습니다. –

+0

패턴에 대한 자세한 내용은 다음과 같습니다. * a (그러면 숫자의 그룹을 만들고 다음 문자를 만날 때까지) *이 문자는 문자를 포함하지 않습니다. –

2

당신은 표현이 여기에 백 슬래시 R에서 탈출 할 필요가

\(    # (
(\d+    # capture 1+ digits 
    (?: B\.C\.)? # B.C. eventually 
) 

주입니다

library(stringr) 

strings <- c('"You Are There" (1953) {The Death of Socrates (399 B.C.) (#1.14)}', 'Þegar það gerist (1998/I) (TV)') 

years <- str_match(strings, "\\((\\d+(?: B\\.C\\.)?)")[,2] 
years 
# [1] "1953" "1998" 

사용할 수 있습니다.

+0

을 참조하십시오. 시대를 정의하려면 'A.D.' 대안을 추가하는 것이 더 합리적 일 수 있습니다. –

+0

@ WiktorStribiżew : 질문에 대한 의견에서 알 수 있듯이 OP가 실제로 원하는 것이 명확하지 않을 수 있으므로 그대로 두십시오. – Jan