2016-10-09 3 views
0

R의 strapplyc를 사용하여 하나의 특정 조건 세트와 일치하는 문자열의 다른 부분을 선택했습니다. 이 부분은 필요한 부분이 두 가지 방법 중 하나로 정의 될 수있는 문자열 부분을 찾을 때까지 성공적으로 작동했습니다. 여기 strapply 내에서 정규식 OR 문을 작성하는 방법

은 자유롭게 \의 t를 뿌리고되는 문자열의 예입니다

\t\t\tsome words here\t\t\tDefect: some more words here Action: more words 

나는 결함 사이에있는 텍스트 캡처 strapply 문을 작성할 수 있습니다와 액션의 시작 :

strapplyc(record[i], "Defect:(.*?)Action") 

결함과 조치 중 선택된 텍스트를 선택하고 선택합니다. 어떤 경우에는 문자열에 액션 섹션이 없으므로 다음 코드를 사용하여 이러한 경우를 캡처합니다. 내가 할 노력 해왔다 무엇

strapplyc(record[i], "Defect:(.*?)$") 

중 하나가 액션으로 끝나는, 또는 문자열의 끝 ($ 사용)하는 텍스트를 캡처합니다.

계속 실패하는 비트입니다. 두 옵션 중 아무 것도 반환하지 않습니다. 여기에 내 오류 코드가 있습니다 :

strapplyc(record[i], "Defect:(.*?)Action|$") 

내가 잘못 가고있는 어떤 생각이든, 더 나은 해결책이 많이 주어질 것입니다.

+0

그룹 안에 교대를 넣어야합니다. 그렇지 않으면 첫 번째 대안은 '결함 : (. *?) 액션'이고 두 번째는'$'입니다. '결함 : (. *?) (?: Action | $)'으로 다시 쓸 수 있습니다. regex의보다 효율적인 버전은'Defect : ((? : [^ A] | A (?! ction)) *)')' –

+0

''Defect :'가 한 줄에 하나씩있는 경우, 그리고 Action : :'gsub (*. * Defect : | Action. * "," ", x)'를 사용하면'Action'을 빠뜨릴 수 있습니다. –

답변

2

을 당신이에 대한 경우 보다 효율적인 솔루션 인 경우. *를 삭제할 수 있습니다. 일치와 같이 당신의 패턴을 풀다 :

Defect:((?:[^A]+|A(?!ction))*) 

이 일치하는 A을하지 않거나 ction 다음에 A하지입니다 문자의 양에 따라 Defect:. 이렇게하면 게으른 점 매칭에 필요한 확장을 피할 수 있습니다. Action 또는 문자열 끝에 도달하면 일치를 멈추기 때문에 두 가지 방법으로 모두 작동합니다. Wiktor에 의해 제안

, 당신은 또한 조금 더 빨리 문자열의 많은 A의가있을 때입니다

Defect:([^A]*(?:A(?!ction)[^A]*)*) 

를 사용할 수 있습니다.

거짓 조기 검색을 피하려면 A(?!ction:) 또는 A(?!ction\s*:)을 사용하는 것이 좋습니다.

+0

좋은 접근 방법으로, 나는 '[Defect : ([^ A] * (? : A (?! ction) [^ A] *) *]'] (https://regex101.com/r/Ugx3hS/1)을 입력하십시오. –

+0

@ WiktorStribiżew 감사합니다. '[^ A] +'대신에 '[^ A]'의 실수로 더 많은 단계를 밟았습니다. 조금 덜 걸리는 것처럼 보이지만 제안을 통합했지만 더 이상 큰 문제는 아닙니다. –

1

대체 연산자 |은 우선 순위가 가장 낮은 정규식 연산자입니다. 즉 정규식 Defect:(.*?)Action|$은 실제로 Defect:(.*?)Action$의 조합입니다. 빈 문자열이 $에 대한 올바른 일치이므로 정규식에서 빈 문자열을 반환합니다.

Defect:(.*?)Action|Defect:(.*?)$ 

또는 당신은 Sebastian Proske said in the comments 같은 그룹에 Action|$를 동봉 할 수 있습니다 :

이를 해결하기 위해, 당신은 OR로 정규 표현식에에게 Defect:(.*?)ActionDefect:(.*?)$을 결합한다

Defect:(.*?)(?:Action|$) 
관련 문제