2013-05-03 5 views
0

정규식에서 lookaround에 문제가 있습니다.Regex, lookaround 후 매칭을 계속하십시오.

여기에 문제가 있습니다. 편집하고 싶은 큰 파일이 있는데, 첫 번째 매개 변수를 유지하면서 두 번째 매개 변수를 제거하여 함수를 변경하려고합니다.

하자 우리가 가진 말 : 두 경우

func2(paramIWantToKeep) :

func1(paramIWantToKeep, paramIDontWant) 

또는

func1(func3(paramIWantToKeep), paramIDontWant) 

내가로 변경하고 싶습니다.

그래서 난 지금 긍정적 예측

func1\((?=.+), paramIDontWant\) 

를 사용하려고, 난 그냥 첫 번째 매개 변수를 선택하지 않으려 고 (그때는 괄호와 같은을 것).

그러나이 작동하지 않습니다, 내 정규식, 앞서 긍정적 인 모습을 무시하고 후 (. +)는 앞서 살펴 전과 같은 위치 (그래서 여는 괄호)

에서 (, paramIDontWant\))를 찾을 것으로 보인다 그래서 내 질문은 일치하는 그룹 (예 :. +) 뒤에 정규식을 계속하는 방법입니다.

감사합니다.

추신 : 내 질문의 영어 및/또는 나쁜 구성에 대한 죄송합니다.

편집 : 나는 숭고한 텍스트를 사용

+1

그것은 도움이 될 수 있습니다. 이것은 대부분 리팩토링 작업처럼 보이지만 많은 훌륭한 편집자가 대신 할 수 있습니다. – melwil

+0

그래, 나는 숭고한 텍스트를 사용하고 예 리팩토링과 함께 해결을 찾았지만, 나는 무시 무시한 그룹을 건너 뛰고 주변을 둘러 본 후에 어떻게 정규식을 계속할 수 있는지 알고 싶다. – Kwelity

+0

검색 방법의 작동 방식은 특정 위치에서 조건을 확인합니다. 당신은 패턴에서 무언가를 "무시"할 수 없습니다. 패턴이 일치하거나 일치하지 않습니다. 특정 패턴을 일치시킬 수 있으며 특정 파트에 관심이있는 경우 캡처 그룹을 사용하여 해당 파트를 추출 할 수 있습니다. – stema

답변

1

먼저 이해해야 할 점은 정규 표현식은 항상 연속 문자열과 일치한다는 것이다. 틈이 생기지 않을 것입니다.

따라서 123abc456abc으로 바꾸려면 123456과 간단히 일치시켜 제거 할 수 없습니다.

대신 capturing group을 사용할 수 있습니다. 이렇게하면 나중에 정규 표현식의 한 부분을 기억할 수 있습니다.이 문자열

\d+([a-z]+)\d+ 

:

예를 들어,이 정규식을 대체 할 수있는, abc123abc456을 대체 할 그 무엇

$1 

실제로는의 내용과 일치를 대체 첫 번째 캡처 그룹. 이 경우 캡처 그룹은 ([a-z]+)이며 abc과 일치합니다. 따라서 전체 경기는 abc으로 바뀝니다.


더 유용하게 사용할 수있는 예 : 감안할 때

:

func2($1) 
이 문자열로

\w+\((\w+),\s*\w+\) 

:

func1(foo, bar) 

이 정규식 교체 에서

결과 : 좀 더 이해할 수있는 대답이 주어질 수있다,이 사용하고자하는 언어 나 에디터 알고

func2(foo) 
+0

고마워, 그게 내가 알아야 할거야. – Kwelity

1
import re 
t = "func1(paramKeep,paramLose)" 
t1 = "func1(paramKeep,((paramLose(dog,cat))))" 
t2 = "func1(func3(paramKeep),paramDont)" 
t3 = "func1(func3(paramKeep),paramDont,((i)),don't,want,these)" 

reg = r'(\w+\(.*?(?=,))(,.*)(\))' 

keep,lose,end = re.match(reg,t).groups() 
print(keep+end) 

keep,lose,end = re.match(reg,t1).groups() 
print(keep+end) 

keep,lose,end = re.match(reg,t2).groups() 
print(keep+end) 

keep,lose,end = re.match(reg,t3).groups() 
print(keep+end) 

>>> 
func1(paramKeep) 
func1(paramKeep) 
func1(func3(paramKeep)) 
func1(func3(paramKeep)) 
+0

감사합니다. 내 텍스트 편집기 내에서 그룹 교체 사용. – Kwelity

0

는이 당신이 준 두 예제에 대처 순서

s/(func1)([^,]*)(,)?(paramIDontWant)(.)/func2$2$5/; 
s/(func2\()(func3\()(paramIWantToKeep).*/$1$3)/; 

이 두 정규 표현식을 적용 생성합니다. 나는 당신이 편집하고있는 실세계 코드가 좀 더 복잡하다고 생각하지만 일련의 정규 표현식을 적용하는 일반적인 아이디어가 도움이 될 수있다.

+0

고마워, 내가 처음에 한 정규 표현식에서 이것을하고 싶었지만, 둘러보기의 개념을 수행 할 수 없다. 그룹화를 사용하거나 하나 이상의 정규식을 사용할 것이다. – Kwelity