2011-09-27 4 views
2

파이썬과 정규 표현식을 사용하여 문자열의 중간 부분을 추출하려고합니다.문자열 중간에 lazy, regex로 둘러싸인 옵션 문자열을 찾으십시오.

>>> re.search(r'(.*?)(HELLO|BYE)?(.*?END)', r'qweHELLOsdfsEND').groups() 
('', None, 'qweHELLOsdfsEND') #what I want is ('qwe', 'HELLO', 'sdfsEND') 
>>> re.search(r'(.*?)(HELLO|BYE)?(.*?END)', r'qweBLAHsdfsEND').groups() 
('', None, 'qweBLAHsdfsEND') #when the middle doesn't match. this is OK 

어떻게 옵션 중간을 추출 할 수 있습니까?

참고 : 이것은 내 첫 번째 게시물입니다.

답변

2

첫 번째 부분은 빈 문자열을 일치 행복하기 때문에 귀하의 정규식 (이 선택 사항이기 때문에 OK입니다), 그래서, 두 번째 부분은 실패에 실패 세 번째 부분 모두를 포착합니다. 해결 방법 : HELLO 또는 END에 첫 번째 부분 일치 아무것도 메이크업 :

>>> re.search(r'((?:(?!HELLO|BYE).)*)(HELLO|BYE)?(.*?END)', r'qweHELLOsdfsEND').groups() 
('qwe', 'HELLO', 'sdfsEND') 
>>> re.search(r'((?:(?!HELLO|BYE).)*)(HELLO|BYE)?(.*?END)', r'qweBLAHsdfsEND').groups() 
('qweBLAHsdfs', None, 'END') 

는 것을 허용인가?

설명 :

(?:   # Try to match the following: 
(?!  # First assert that it's impossible to match 
    HELLO|BYE # HELLO or BYE 
)   # at this point in the string. 
.   # If so, match any character. 
)*   # Do this any number of times. 
+0

예, 내 문제를 해결합니다! 나는 전에 우연히 만나지 않았다 (?!). – chobok

+0

[튜토리얼] (http://www.regular-expressions.info/lookaround.html)을 확인하십시오. Lookaround는 훌륭한 기능입니다. –

+0

좋은 튜토리얼입니다. 정말 잘 쓰여지고 포괄적입니다. 고마워 – chobok

1

당신은 이런 식으로 작업을 수행 할 수 있습니다

try: 
    re.search(r'(.*?)(HELLO|BYE)(.*?END)', r'qweHELLOsdfsEND').groups() 
except AttributeError: 
    print 'no match' 
+0

+1 :이 없을 때, 그것은있을 때를 추출하고 다른 뭔가를하고 싶은 경우는 * * 정말 "선택"이 아니다. Regexes는 종종 몇 가지 다른 수준에서 한 번에 추론해야하기 때문에 해결하기가 까다로울 수 있습니다. –

관련 문제