2016-08-13 2 views
0

내가 사이에있는 텍스트 추출 싶다 "하나""이"사이의 "세""이" 문자열의 S1"하나 즐 1 2 : bla2 3 : bla3 ". 그러나 "2 : bla2"은 문자열 s2에 반드시 포함될 필요는 없습니다. 따라서 s2"one : bla 1 three : bla3" 일 수도 있습니다.선택적 패턴이있는 정규식을 사용하여 텍스트를 추출하는 방법은 무엇입니까?

나는 다음과 같은 R-코드와 함께 올하지만 한 "이 ..."주위에 추가 괄호 내 시도와 물음표가 작동하지 않습니다

library(gsubfn) 
s1 <- "one: bla 1 two: bla2 three: bla3" 
s2 <- "one: bla 1 three: bla3" 
strapplyc(s1, "one: (.*) (two: (.*))? three: (.*)") 
strapplyc(s2, "one: (.*) (two: (.*))? three: (.*)") 
+1

무엇 단지'\ w *에 분할에 대한 (일 | 두 | 세) : \ * w '? –

+0

두 개가 존재하지 않는다면 정규 표현식은 세 개 앞에 두 개의 공백이 있어야하지만 s2에 세 개가 오기 전에 공백이 하나만 있어야하므로 괄호 안에 두 번째 공백을 두어보십시오. 'strapplyc (s2, 하나 : (. *) (2 : (*))? 3 : (bla3) ")' –

+0

@ G.Grothendieck 귀하의 제안은 s2에서 효과가있는 것으로 보입니다. s1. – tover

답변

2

아마도 문제는 one: 이후의 .*two: 부분과 그 뒤의 텍스트를 소비하고 있다는 것입니다. 그래서 예를 들어 당신의 라인에 일치하는 그룹은

1: "bla 1 two: bla2" 
2: [empty] 
3: "bla3" 

당신은 물음표와 함께 최초의 별표가 아닌 욕심함으로써이 문제를 해결할 수있을 것이다.

다른 점 : two: 부분에 괄호 안에 공백을 넣어야합니다. 그렇지 않은 경우 one:two: 부분 사이에 공백이 두 개 있어야합니다.

또한 미세 조정을 위해 ?:을 사용하여 캡쳐되지 않은 옵션 부분 주위에 괄호를 만들 수 있습니다. 세 가지만 캡처하려는 경우 two: 부분의 괄호는 우선 순위이므로 캡처 할 필요가 없습니다.

그래서 모두 당신이 뭔가를 할 것이다 :

strapplyc(s1, "one: (.*?)(?: two: (.*))? three: (bla3)") 
+0

그게 효과가있다. 감사! – tover

관련 문제